使用 sed 仅删除第一个匹配项

使用 sed 仅删除第一个匹配项
$ echo -e "AsometAhingA\nsomethingA\nASomethiAng"
AsometAhingA
somethingA
ASomethiAng
$ echo -e "AsometAhingA\nsomethingA\nASomethiAng" | sed "s/A//"
sometAhingA
something
SomethiAng
$

我知道这sed "s/A//"会删除每一行中的第一个匹配项。但我只想删除文本文件或流中的第一个匹配项。我该怎么做?例如:sed -i "MAGIC" file.txt

答案1

不幸的是,MAGIC不是一个sed命令,所以你必须使用其他命令:

sed -i '0,/A/ s///' 文件.txt
perl -i -pe'如果(!$changed){s/A//和$changed++;}'文件.txt
echo -e "/A/s///\nwq" | ed 文件.txt

答案2

只要它是 GNU sed(它可能是,因为它是 Fedora),你就应该能够执行以下操作:

sed '0,/RE/{//d;}' file.txt

答案3

如果您的版本sed(非 GNU)不支持 0 作为行地址,那么您可以执行以下操作:

sed '/A/{s///;:a;n;ba}' file.txt

它按原样打印每一行,直到找到具有模式的一行。然后删除该模式。之后,它从ba(分支到“a”)循环到:a(标签“a”),并读取和打印每一行,而无需再次查找模式。

相关内容