Я хотел бы удалить каждую строку, содержащую шаблон после первой строки (шаблон /^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 ;
) следует за t
or b
, что делает bsd sed счастливым.