2011-04-07 108 views
16

从该文件中删除它,我想删除包含了文件中的特定字符串的一行。我怎样才能做到这一点,而不使用awk?我试图使用sed,但我无法实现。搜索字符串和Shell脚本

回答

28

这应做到:

sed -e s/deletethis//g -i * 
sed -e "s/deletethis//g" -i.backup * 
sed -e "s/deletethis//g" -i .backup * 

它将取代的 “deletethis” 所有出现在所有文件 “”(无)(*),就地编辑它们。

在第二种形式中的图案可被编辑一点更安全的,它使任何修改过的文件的备份,通过用“的.backup”后面添加它们。

第三种形式是这样的sed喜欢它的一些版本。 (例如Mac OS X中)

man sed获得更多信息。

+0

我认为它通常是一个更好的主意引述表达,另外,我想指出,其中的sed的'-i.bak'语法创建备份文件与给定的扩展名。即也可以是'-i.backup', – 0xC0000022L 2011-04-07 16:40:58

+1

@STATUS你是对的,某些版本的sed实际上需要后缀。 – mvds 2011-04-07 16:42:30

+2

这不行。这删除了字符串。我想删除包含这个字符串的行 – virtue 2011-04-07 16:59:05

16
sed -i '/pattern/d' file 

使用'd'删除一行。这至少适用于GNU-Sed。

如果您桑达没有的选项,改变位置的文件,也许你可以使用一个中间文件,保存修改:

sed '/pattern/d' file > tmpfile && mv tmpfile file 

直接写入源通常不会工作:sed '/pattern/d' file > file所以如果你怀疑它,请在尝试之前复制一份。

+1

这是正确的答案原来的问题。出于安全原因,您可以使用'-i.bak'而不是'-i'来创建原始文件的备份。 – Mike 2017-01-26 14:05:42

+0

这是不工作的busybox的'sed',它会删除所有的线不是字符串,@mvds答案工程 – danigosa 2018-01-28 15:52:40

+0

@danigosa:嗯,这就是为什么MVDS答案是错的,现在的问题是,要删除一条线,而不是字符串。阅读这个问题,在最有回报的答案中阅读美德的评论。 – 2018-01-29 02:44:53

0

尝试VIM路:

ex -s +"g/foo/d" -cwq file.txt