我有一个名为test.txt的文件,其中包含以下内容:
test1
test2
test3
test4
test5
test3
我使用以下代码从文件中删除"test3"
:
sed -i '/test3/d' test.txt
但是我只想删除第一次出现的"test3"
答案 0 :(得分:5)
这个sed one-liner将帮助你:
sed '0,/test3/{/test3/d}' file
test1
test2
test4
test5
test3
这个sed命令使用了sed的地址。 Sed有不同的地址表达式,这在sed的Info页面中有详细解释。
对于此命令,0, /pattern/
将从第一行聚焦到匹配/pattern/
的第一行,然后执行操作:/pattern/d
,即删除第一个匹配的行。完成此操作后,地址0,/pattern/
将不满足以下所有行,因此采取默认操作:按原样打印。
答案 1 :(得分:2)
依靠持有空间的另一种方法(不像肯特那么好):
sed -e '/test3/{
x
/^$/d
}'
这会查找模式,然后如果它看到它,它会与第一次点击时为空的保留空间进行交换,然后核对剩余的空白行。对于随后的命中,保持空间将包含线本身,由第一次击中交换,因此交换将不执行任何操作,并且空行 - 核心将失败。
然而,我认为,真正的答案是不要使用sed
:当事情变得复杂到需要任何想法时,我几乎总会发现使用Perl或其他任何东西更容易。 / p>
答案 2 :(得分:1)
在Perl中
perl -pe 'next if /test3/ and not $seen++' test.txt
答案 3 :(得分:0)
另一种Perl大锤的方式
perl -0777 -p's/text3\n//' test.txt