Я использую это
cat foo.txt | sed '/bar/d'
удалить строки, содержащие строку bar
в файле.
Однако я хотел бы удалить эти строки и строку сразу после нее . Предпочтительно в sed
, awk
или другой инструмент , который доступен в Mingw32.
Это своего рода реверс , что я могу получить в grep
с -A
и -B
напечатать соответствующие линии, а также линию до / после согласованной линии.
Есть ли простой способ добиться этого?
text-processing
sed
awk
replace
jakub.g
источник
источник
Ответы:
Если у вас GNU sed (то есть не встроенный Linux или Cygwin):
Если у вас
bar
две последовательные строки, вторая строка будет удалена без анализа. Например, если у вас есть 3-строчный файлbar
/bar
/foo
,foo
строка останется.источник
bar
s, поэтому этот супер легко запомнить.sed '/bar/d'
если вы просто хотите «Удалить строку, содержащую определенную строку», а не следующую.sed '/math/q'
sed '/bar/d'
Если это
bar
может произойти в последовательных строках, вы можете сделать:который может быть адаптирован для удаления более 2 строк, заменяя 2 выше количество строк для удаления, включая соответствующую.
Если нет, это легко сделать
sed
с помощью решения @MichaelRollins или:источник
/bar/
на/bar|baz|whatever/
. Вsed
этом синтаксисе, кажется, не работает.sed
использовать «расширенные» регулярные выражения. Более подробная информация здесь: gnu.org/software/sed/manual/html_node/… . Обратите внимание, что это относится и кgrep
. Вот мой собственный рабочий пример:echo $'0a\n1b\n2c' | sed '/0a\|1b/d'
.Я не владею sed, но в awk это легко сделать:
Скрипт awk гласит: для строки, содержащей bar, получите следующую строку (getline), затем пропустите всю последующую обработку (next). 1 шаблон в конце печатает оставшиеся строки.
Обновить
Как указано в комментарии, вышеуказанное решение не работает с последовательным
bar
. Вот пересмотренное решение, которое принимает его во внимание:Теперь мы продолжаем читать, чтобы пропустить все строки / bar /.
источник
grep -A
100%, вам также нужно правильно обрабатывать любое количество последовательныхbar
строк (удаляя весь блок и 1 строку после).Вы захотите использовать возможности сценариев sed для достижения этой цели.
Пример данных:
Команда «N» добавляет следующую строку ввода в пространство шаблона. В сочетании со строкой из сопоставления с образцом (/ bar /) будут строки, которые вы хотите удалить. Затем вы можете нормально удалить с помощью команды "d".
источник
sed -e '/bar/{N;d}' sample1.txt
Если какая-либо строка, следующая непосредственно за совпадением, должна быть удалена, то ваша
sed
программа должна будет рассмотреть последовательные совпадения. Другими словами, если вы удаляете строку после совпадения, которое также совпадает, то, вероятно, вам следует удалить также и строку, следующую за этим.Это реализовано достаточно просто - но вам придется немного оглянуться назад.
Он работает путем замены мест удержания и шаблонов для каждой прочитанной строки, поэтому последнюю строку можно сравнивать с текущей каждый раз. Поэтому, когда
sed
читает строку, она обменивается содержимым своих буферов - и предыдущая строка затем является содержимым буфера редактирования, а текущая строка помещается в удерживающее пространство.Поэтому
sed
проверяет предыдущую строку на соответствиеmatch
и, если она!
не найдена , запускаются два выражения в{
функции}
.sed
будетg
перезаписывать пространство удержания, перезаписывая пространство образца - это означает, что текущая строка будет находиться как в пространстве удержания, так и в пространстве образца - и затем будет//
проверять его на соответствие его недавно скомпилированному регулярному выражениюmatch
- и если это неmatch
так являетсяp
rinted.Это означает, что строка печатается только в том случае, если это не так, а в предыдущей строке нет . Это также исключает любые ненужные замены для последовательностей es.
match
match
match
Если вы хотите версию, которая может отбрасывать произвольное количество строк, встречающихся после a
match
, потребуется немного больше работы:... замените 5 на количество строк (включая совпавшую строку), которые вы хотите удалить ...
источник