请教:如何利用shell批量删除文件中的特定行

讨论其他BSD项目及其衍生品,如:FreeBSD,DragonFlyBSD,PC-BSD,DesktopBSD,FreeNAS,NAS4Free,m0n0wall,pfSense,pacBSD,OpenDarwin...
回复
头像
leo
帖子: 2465
注册时间: 2010-01-21 3:27

请教:如何利用shell批量删除文件中的特定行

帖子 leo » 2011-10-07 4:53

请熟悉shell的朋友指点一下,如何批量删除一个文件夹及其子文件夹内所有文件里包含特定语句的行。——有点绕嘴,例如:
有的txt和html文件里面可能包含了一行内容:"$cvs877662,文件生成于2003年一月",

代码: 全选

Atacand lead....
[color=red][B]$cvs877662,文件生成于2003年一月[/B][/color],...........
Bulk book.....


如何批量将所有包含这一内容的特定行删除,不想删除后留下一个空行,而是很干净地全部删除。例如上例中变成这样:

代码: 全选

Atacand lead....
Bulk book.....

自己想偷个懒,请熟悉shell的朋友指点一二,多谢了。:D

wkx9dragon
锌 Zn
帖子: 493
注册时间: 2010-02-02 18:00

回复: 请教:如何利用shell批量删除文件中的特定行

帖子 wkx9dragon » 2011-10-08 9:19

find dir | grep "$cvs877662,文件生成于2003年一月" | xargs -I {} sed -i "/$cvs877662,文件生成于2003年一月/d" {}

wkx9dragon
锌 Zn
帖子: 493
注册时间: 2010-02-02 18:00

回复: 请教:如何利用shell批量删除文件中的特定行

帖子 wkx9dragon » 2011-10-08 9:20

我在windows下用的gnu sed,grep,xargs ,find,bsd下还没试过,有问题发帖子哦,我试试。

头像
leo
帖子: 2465
注册时间: 2010-01-21 3:27

回复: 请教:如何利用shell批量删除文件中的特定行

帖子 leo » 2011-10-08 10:23

感谢wkx9dragon兄提供方法,可惜我这里(OpenBSD 5.0 i386 current)测试不过,不知道是什么原因,继续请教了,假设我要删除当前123文件夹下所有文件中包含"|| # CVS: $RCSfile$的行,是否命令为:

代码: 全选

# find 123 | grep "|| # CVS: $RCSfile$" | xargs -I {} sed -i "/|| # CVS: $RCSfile$/d" {}
sed: unknown option -- i
usage: sed [-aEnru] command [file ...]
       sed [-aEnru] [-e command] [-f command_file] [file ...]
#

结果如上所示,请问 -i 参数的含义?

wkx9dragon
锌 Zn
帖子: 493
注册时间: 2010-02-02 18:00

回复: 请教:如何利用shell批量删除文件中的特定行

帖子 wkx9dragon » 2011-10-08 16:19

sed -i 选项指在文件上操作,因为sed默认是不修改源文件而是输出。你找找bsd sed的修改源文件选项,你的搜索里有特殊字符可能需要\来转意

头像
leo
帖子: 2465
注册时间: 2010-01-21 3:27

回复: 请教:如何利用shell批量删除文件中的特定行

帖子 leo » 2011-10-08 22:04

好的,多谢了,继续研究一下。

wkx9dragon
锌 Zn
帖子: 493
注册时间: 2010-02-02 18:00

回复: 请教:如何利用shell批量删除文件中的特定行

帖子 wkx9dragon » 2011-10-08 22:52

我在openbsd上试了试,发现不好使,没有-i选项,而且不能转义$,如果没有相似的话,用.代替了。
cd dir && grep -rl *.* | xargs -I {} sed -i '/|| # CVS: .RCSfile./d' {}
如果实在是要用bsd sed的话,编一个mysed.sh吧,应该很简单的。把sed的结果输出到某个临时文件,然后改名为源文件。然后用自己的mysed.sh代替sed就可以了。

头像
leo
帖子: 2465
注册时间: 2010-01-21 3:27

回复: 请教:如何利用shell批量删除文件中的特定行

帖子 leo » 2011-10-09 0:10

事不等人,因着急,还是先用ultraEdit解决了,日后有时间再研究BSD下的方式。

bsd
钛 Ti
帖子: 23
注册时间: 2011-02-22 14:26
联系:

回复: 请教:如何利用shell批量删除文件中的特定行

帖子 bsd » 2011-10-11 0:09

用这个行吗?

# sed -i "/cvs877662,文件生成于2003年一月/d" `grep cvs877662,文件生成于2003年一月 -rl 123/`

` 为键盘数字1前边的翻引号`,而不是Enter 前的 ' 另外,只要匹配这行中部分,不必是全部文字,整个行都能删除。

头像
leo
帖子: 2465
注册时间: 2010-01-21 3:27

回复: 请教:如何利用shell批量删除文件中的特定行

帖子 leo » 2011-10-11 9:17

OpenBSD的sed里没有 -i 选项,不过,也多谢BSD兄了。

wkx9dragon
锌 Zn
帖子: 493
注册时间: 2010-02-02 18:00

回复: 请教:如何利用shell批量删除文件中的特定行

帖子 wkx9dragon » 2011-10-11 16:42

netbsd 里也没有,不知道大牛们是怎么用的。

wkx9dragon
锌 Zn
帖子: 493
注册时间: 2010-02-02 18:00

回复: 请教:如何利用shell批量删除文件中的特定行

帖子 wkx9dragon » 2011-10-16 22:22

leo 写了:感谢wkx9dragon兄提供方法,可惜我这里(OpenBSD 5.0 i386 current)测试不过,不知道是什么原因,继续请教了,假设我要删除当前123文件夹下所有文件中包含"|| # CVS: $RCSfile$的行,是否命令为:

代码: 全选

# find 123 | grep "|| # CVS: $RCSfile$" | xargs -I {} sed -i "/|| # CVS: $RCSfile$/d" {}
sed: unknown option -- i
usage: sed [-aEnru] command [file ...]
       sed [-aEnru] [-e command] [-f command_file] [file ...]
#

选了个perl 语句可以了,在openbsd 5。0 x64上。perl 有-i 选项可用噢。
grep -r -l RCSfile *.* | xargs -I {} perl -i -ne 'print unless /\|\| # CVS: \$RCSfile\$/' {}

头像
leo
帖子: 2465
注册时间: 2010-01-21 3:27

回复: 请教:如何利用shell批量删除文件中的特定行

帖子 leo » 2011-10-16 22:30

不好意思,最近分身干别的事,多谢兄弟,改日再试。

回复

在线用户

正浏览此版面之用户: Bing [Bot] 和 0 访客