У меня есть файл, 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
скрипт применяется ккаждыйстрока входных данных.
(являющееся расширением +0
GNU) означает, что ваш скрипт эквивалентен
$ 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 sed
Ubuntu 14.04
... addr1,+N Будет соответствовать addr1 и N строкам, следующим за addr1. ...