分页: 1 / 1
请教:如何利用shell批量删除文件中的特定行
发表于 : 2011-10-07 4:53
由 leo
请熟悉shell的朋友指点一下,如何批量删除一个文件夹及其子文件夹内所有文件里包含特定语句的行。——有点绕嘴,例如:
有的txt和html文件里面可能包含了一行内容:"
$cvs877662,文件生成于2003年一月",
代码: 全选
Atacand lead....
[color=red][B]$cvs877662,文件生成于2003年一月[/B][/color],...........
Bulk book.....
如何批量将所有包含这一内容的特定行删除,不想删除后留下一个空行,而是很干净地全部删除。例如上例中变成这样:
代码: 全选
Atacand lead....
Bulk book.....
自己想偷个懒,请熟悉shell的朋友指点一二,多谢了。:D
回复: 请教:如何利用shell批量删除文件中的特定行
发表于 : 2011-10-08 9:19
由 wkx9dragon
find dir | grep "$cvs877662,文件生成于2003年一月" | xargs -I {} sed -i "/$cvs877662,文件生成于2003年一月/d" {}
回复: 请教:如何利用shell批量删除文件中的特定行
发表于 : 2011-10-08 9:20
由 wkx9dragon
我在windows下用的gnu sed,grep,xargs ,find,bsd下还没试过,有问题发帖子哦,我试试。
回复: 请教:如何利用shell批量删除文件中的特定行
发表于 : 2011-10-08 10:23
由 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 ...]
#
结果如上所示,请问 -i 参数的含义?
回复: 请教:如何利用shell批量删除文件中的特定行
发表于 : 2011-10-08 16:19
由 wkx9dragon
sed -i 选项指在文件上操作,因为sed默认是不修改源文件而是输出。你找找bsd sed的修改源文件选项,你的搜索里有特殊字符可能需要\来转意
回复: 请教:如何利用shell批量删除文件中的特定行
发表于 : 2011-10-08 22:04
由 leo
好的,多谢了,继续研究一下。
回复: 请教:如何利用shell批量删除文件中的特定行
发表于 : 2011-10-08 22:52
由 wkx9dragon
我在openbsd上试了试,发现不好使,没有-i选项,而且不能转义$,如果没有相似的话,用.代替了。
cd dir && grep -rl *.* | xargs -I {} sed -i '/|| # CVS: .RCSfile./d' {}
如果实在是要用bsd sed的话,编一个mysed.sh吧,应该很简单的。把sed的结果输出到某个临时文件,然后改名为源文件。然后用自己的mysed.sh代替sed就可以了。
回复: 请教:如何利用shell批量删除文件中的特定行
发表于 : 2011-10-09 0:10
由 leo
事不等人,因着急,还是先用ultraEdit解决了,日后有时间再研究BSD下的方式。
回复: 请教:如何利用shell批量删除文件中的特定行
发表于 : 2011-10-11 0:09
由 bsd
用这个行吗?
# sed -i "/cvs877662,文件生成于2003年一月/d" `grep cvs877662,文件生成于2003年一月 -rl 123/`
` 为键盘数字1前边的翻引号`,而不是Enter 前的 ' 另外,只要匹配这行中部分,不必是全部文字,整个行都能删除。
回复: 请教:如何利用shell批量删除文件中的特定行
发表于 : 2011-10-11 9:17
由 leo
OpenBSD的sed里没有 -i 选项,不过,也多谢BSD兄了。
回复: 请教:如何利用shell批量删除文件中的特定行
发表于 : 2011-10-11 16:42
由 wkx9dragon
netbsd 里也没有,不知道大牛们是怎么用的。
回复: 请教:如何利用shell批量删除文件中的特定行
发表于 : 2011-10-16 22:22
由 wkx9dragon
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\$/' {}
回复: 请教:如何利用shell批量删除文件中的特定行
发表于 : 2011-10-16 22:30
由 leo
不好意思,最近分身干别的事,多谢兄弟,改日再试。