这是一个测试文件:
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
答案 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'的行。