Sed - 从文件中删除第一次出现的字符串

时间:2016-02-29 13:19:44

标签: perl sed

我有一个名为test.txt的文件,其中包含以下内容:

test1
test2
test3
test4
test5
test3

我使用以下代码从文件中删除"test3"

sed -i '/test3/d' test.txt

但是我只想删除第一次出现的"test3"

4 个答案:

答案 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