Удалить строки с соответствующим шаблоном после первой строки с помощью sed

Удалить строки с соответствующим шаблоном после первой строки с помощью sed

Я хотел бы удалить каждую строку, содержащую шаблон после первой строки (шаблон /^country\t/). Я могу удалитькаждыйвхождение с sed '/^country\t/d' in.txt > out.txt, но я хотел бы сохранить первое вхождение в первой строке.

Предыстория такова, что у меня есть каталог файлов, разделенных табуляцией, с заголовками, и я объединяю эти файлы с помощью cat. Я хотел бы удалить лишние заголовки.

В Vim я мог бы сделать что-то вроде : 2,$g/^country\t/d, но не могу понять решение sed. Когда я пытаюсь, sed '2,$ /^country\t/d in.txt > out.txtя получаю ошибку unknown command: /.

Спасибо!

решение1

Прямого пути нет, но вот обходной путь:

sed -e '1,2 s/^country\t/NOCHANGE/' -e '/^country\t/d' -e 's/NOCHANGE/country/'  in.txt > out.txt

решение2

Это может вам подойти:

sed '1b;/^country\t/d' in.txt > out.txt

или

sed '1!{/^country\t/d}' in.txt > out.txt

решение3

sed '/pattern/{x;/pattern/!{x;h;b;};x;d}' file

Это удалит все соответствующие строки ПОСЛЕ первой соответствующей строки. Комментарий:

/шаблон/- соответствие шаблону

{Икс- если вышеприведенное совпадает, поменять шаблон и записать буфер

;/шаблон/!{x;h;b;}- теперь проверьте буфер шаблона (теперь он будет пустым при ПЕРВОМ совпадении), и если он не содержит шаблон, то снова поменяйте местами шаблон и буфер хранения «x», затем КОПИРУЙТЕ буфер шаблона в буфер хранения «h», перейдите «b» в конец скрипта и загрузите следующую строку.

;х;д}- этот бит выполняется только в том случае, если отрицательный шаблон сопоставления на предыдущем шаге не срабатывает - т.е. буфер шаблона соответствует вашему шаблону. В этом случае поменяйте буфер удержания и шаблона обратно 'x' и удалите строку 'd'.

решение4

если /pattern/ не соответствует пустой строке, то holdдля проверки первого совпадения используется выражение «пробел инициализируется как пустая строка»:

сохраните первую строку:

sed '/pattern/ {x; /^$/!d; g;}' file

удалите первую строку:

sed '/pattern/ x' file

отредактируйте только первую строку:

sed '/pattern/ {x; /^$/!b'$'\n'' g; s/pattern/xx/; }' file

отредактируйте только следующую строку:

sed '/pattern/ {x; s/pattern/xx/; t'$'\n'' g; }' file

PS: $'\n'(не a ;) следует за tor b, что делает bsd sed счастливым.

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