4
$ 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

3 ответа3

6

Пока это GNU sed (что, вероятно, так как это Fedora), вы должны иметь возможность делать:

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

К сожалению, MAGIC не является командой sed , поэтому вам придется использовать что-то еще:

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

Если у вас есть версия sed (не-GNU), которая не поддерживает 0 в качестве адреса строки, то вы можете сделать это:

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

Он печатает каждую строку как есть, пока не найдет строку с рисунком. Затем он удаляет шаблон. После этого он переходит от ba (ветвь к "a") к :a (метка "a") и считывает и печатает каждую строку, не ища шаблон снова.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .