2010-11-22 81 views
2

我想从下面的my.txt中删除'third'和空白行,然后将o/p存储在my.txt中 sed命令应该是什么? 注:这应该是一个循环,直到文件如何用sed删除文本或空行?

my.txt - 

first 

sec 


third 


third 

third 

回答

1
sed -i 's/third//g' my.txt 

月底将修改就地文件。

+2

这不会删除该行,将只需更换“第三”与空字符串。 – 2010-11-22 12:43:31

+0

@Sean:确实;我想我误解了这个问题。 – 2010-11-22 13:57:29

2

你可以这样做:

sed -i -r '/^(third|)$/d' my.txt 
+0

使用标准(POSIX)'sed'不支持的扩展正则表达式。这没有错 - 它只是一个应该注意的延伸。 – 2010-11-22 14:00:27

4

使用GNU sed的,重写是微不足道的 '-i' 选项;使用标准sed,您必须写入临时文件,然后将其复制到原始文件中。

其他答案会在问题的“空行”要求之前作出回答。

sed -i '/third/d;/^[ ]*$/d' my.txt 

命令的第一部分,直到分号,查找“第三”,并删除任何匹配线。命令的第二部分查找由零个或多个空白组成的行,并删除它们。如果要删除带有空格和制表符的行,请在字符类中添加一个制表符 - 用SO标记语言显示制表符并不方便。

你能等效写:

sed -i -e '/third/d' -e '/^[ ]*$/d' my.txt 

以及非GNU sed的,你可以使用:

sed '/third/d;/^[ ]*$/d' my.txt > x.$$ 
cp x.$$ my.txt 
rm -f x.$$ 
+0

没有GNU sed,另一种方法是使用普通的'ed'。虽然命令相同,但总体语法不同。 – mouviciel 2010-11-22 13:50:48

+0

你可以在你的字符类('[\ t]')中使用'\ t'或者使用'[[:blank:]]'(空格或制表符)或'[[:space:]] locale:空格,制表符,换行符,回车符,换页符和垂直制表符。在最后一个例子中,最好是使用'sed ... && cp ...',这样原始文件不会丢失,如果'sed'失败 – 2010-11-22 15:31:11

+0

@ Dennis:你可能对GNU sed的'\ t''是正确的;但是,POSIX标准不能识别/强制它,而且Solaris 10也没有(仅仅指出一个GNU sed不是从表面上看,Solaris 10 sed似乎可以识别'[[:blank:]]'等,但它似乎并没有对它们起作用,全世界都没有使用GNU,对于条件拷贝来说是正确的 – 2010-11-22 15:57:26

0

sed流编辑器,即它是一个用于编辑 (管道)不是文件。如果你想要编辑的文件,你应该使用一个文件编辑器如ed

ed my.txt <<-HERE 
    ,g/^third$/d 
    ,g/^$/d 
    w 
    q 
HERE 
+0

全局命令之前的逗号的意义是什么? – 2010-11-22 13:58:44

+0

@Jonathan Leffler:这是地址,a,b表示从行a到线'b'“。 'a'的默认值是'1','b'的默认值是'$',即最后一行。 Ergo,','意思是从'1'行到最后一行',IOW整个文件。由于'ed'是一个文件编辑器,它实际上可以在文件中四处移动,因此所有命令都需要一个地址。 OTOH不能指望能够做到这一点,因为你通常不能在一个流中倒退。 – 2010-11-22 14:08:14

+0

好的:我总是简单地使用'g/^ third $/d',因为全局搜索的范围是整个文件,除非你另有指定。如果我想将操作限制在以'x'开始的前一行到以'z'开始的以下行,然后例如'?^ x?,/^z/g/^ third $/d'。但是我没有想到添加逗号 - 在使用'ed'时,我可能不会在那些奇怪的场合。 – 2010-11-22 14:12:57