Можно ли удалить только первую совпадающую строку с помощью sed?

Можно ли удалить только первую совпадающую строку с помощью sed?

У меня есть файл, testfile.txtсодержащий

pippo=x
pluto=y
1234=z

Я хотел бы удалить толькопервыйсопоставление строк /^[a-z]\+=/(первая строка в этом примере).

Я попробовал следующую команду, но безуспешно:

sed   '/^[a-z]\+=/,+0d' testfile.txt

но первыйдвастроки удалены.

Есть ли способ выполнить эту задачу с помощью sed?

С уважением

решение1

Проблема с вашей sedкомандой

$ sed '/^[a-z]\+=/,+0d' testfile.txt

заключается в том, что sedскрипт применяется ккаждыйстрока входных данных.

(являющееся расширением +0GNU) означает, что ваш скрипт эквивалентен

$ sed '/^[a-z]\+=/d' testfile.txt

и первая и вторая строки будут удалены, как вы заметили.

Кстати, вы получите ровно то же самое.эффектс использованием +1, но по другим причинам. dКоманда будет применена не к строке один и два по отдельности, а к первым двум строкам из-за совпадения в первой строке (т. е. диапазон команды dбудет включать строки один и еще одну, +1). Это не удалит строку три, потому что она находится за пределами диапазона.

sedРешение GNU

$ sed '0,/^[a-z]\+=/{//d}' testfile.txt

тот, что разместил пользователь @Whitefield, работает и довольно хорош (хотя эта -rопция не нужна, и 0начальный адрес можно изменить 1в этом случае, если вы хотите больше соответствовать POSIX).

Вариант BSD sedтого же подхода будет выглядеть так:

$ sed '1,/^[a-z]+=/{/^[a-z]+=/d
  }' testfile.txt

Экранирование +необходимо только в том случае, если вы sedреализуете "устаревшие базовые регулярные выражения", а не "современные базовые регулярные выражения". BSD sedи GNU sedна моей системе (Mac OS X) кажутся "современными". В POSIX такого различия нет, а параллельное чтение руководств ( re_format(7)по BSD, где такое различие есть) и спецификации POSIX сводит меня с ума.

решение2

@John1024 Извините, но ваше решение работает только в том случае, если первая совпадающая строка является первой строкой файла.

Я решил проблему с помощью следующего кода sed -r '0,/^[a-z]\+=/{//d;}' testfile.txt, но я по-прежнему убежден, что мое предыдущее решение должно было работать даже с posix sed.

На самом деле идея заключалась в том, чтобы указать в качестве адреса второй строки смещение в 0 строк... но это все равно удаляет и следующую строку, это похоже на ошибку.

из man sedUbuntu 14.04

... addr1,+N Будет соответствовать addr1 и N строкам, следующим за addr1. ...

Связанный контент