題 只刪除第一次匹配/匹配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 “魔法” file.txt


4
2018-01-23 10:15


起源


stackoverflow.com/questions/148451/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


答案:


不幸, MAGIC 不是一個 sed 命令,所以你將不得不使用其他東西:

sed -i'0,/ A / s ///'file.txt
perl -i -pe'if(!$ changed){s / A //和$ changed ++;}'file.txt
echo -e“/ A / s /// \ nwq”| ed file.txt

5
2018-01-23 10:40



在你的 sed 解決方案,如果“AsometAhingA”是第二行或更晚行,“A”在以前的任何地方都沒有發生,它還能工作嗎? - Marcos


只要它是GNU sed(它可能是,因為它是Fedora),你應該能夠做到:

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

6
2018-01-23 10:38



你知道分號是否需要嗎?它對我來說似乎沒有它,但我不想在路上遇到困難。 - wchargin


如果你有一個版本 sed (非GNU)不支持0作為行地址,那麼你可以這樣做:

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

它按原樣打印每一行,直到找到具有該模式的一行。然後它刪除模式。之後它會循環播放 ba (分支到“a”)到 :a (標記“a”)並讀取並打印每一行而不再查找該模式。


2
2018-01-23 16:29