有什么方法可以通过sed删除第一次出现的模式?

时间:2011-12-01 01:44:09

标签: linux bash shell

这是一个测试文件:

xxx
hello 
hello 
others

我想使用sed:

sed -i '/hello/d' the_test_file

这将删除所有包含“hello”的行,那么如何删除第一行包含“hello”?

我认为sed不能这样做,但我可以使用perl。它就像:

perl -00 -pe "s/hello//" the_test_file > /tmp/file && mv /tmp/file the_test_file

4 个答案:

答案 0 :(得分:2)

显示文件的原始内容。

cat the_test_file
1
2
3
popo
hello 1
hello 2
others

运行sed命令后显示结果

sed -e '0,/^hello/{//d;}' the_test_file
1
2
3
popo
hello 2
others

最后回答你的问题

注意:感谢jaypal

sed -i"bak" -e '0,/^hello/{//d;}' the_test_file

答案 1 :(得分:1)

删除第一个问候

sed -e "/hello/ N;n;d;" the_test_file

删除第二个问候

sed -e "/hello/ N;n;n;d;" the_test_file

如果连续有多行hello,并希望保留第一个hello并删除其余的

sed -e ":loop" -e "/hello/ N; s/\(hello.*\)\n\(hello.*\)/\1/" -e "t loop" the_test_file

如果连续有多行hello,并且只想保留最后一个hello

sed -e ":loop" -e "/hello/ N; s/\(hello.*\)\n\(hello.*\)/\2/" -e "t loop" the_test_file

the_test_file

xxx
hello1
hello2
hello3
others

答案 2 :(得分:0)

awk解决方案:

$ cat file
something
hello 1
else
hello 2
others
hello 3

$ awk '/hello/ && ++c==1{next}1' file
something
else
hello 2
others
hello 3

答案 3 :(得分:0)

这就是诀窍(但不容易概括):

$ sed -e '1,/hello/p' -e '1,/hello/d' -e '/hello/d' <<!
> xxx
> hello 
> hello 
> others
!
xxx
hello 
others
$

逻辑是将第1行的行打印到包含'hello'的第一行;然后删除那些行(这样就不会发生自动打印);之后,只需删除匹配'hello'的行。