2

Я хотел бы удалить каждую строку, которая содержит шаблон после первой строки (шаблон - /^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: / .

Спасибо!

5 ответов5

2

Это может работать для вас:

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

или же

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

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

sed -e '1,2 s/^country\t/NOCHANGE/' -e '/^country\t/d' -e 's/NOCHANGE/country/'  in.txt > out.txt
0
sed '/pattern/{x;/pattern/!{x;h;b;};x;d}' file

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

/pattern/ - сопоставить шаблон

{x - если вышеприведенное совпадение, поменяйте местами шаблон и удерживайте буфер

;/шаблон/!{x; h; b;} - теперь протестируйте буфер шаблонов (теперь он будет пуст при первом совпадении), а если нет! уже содержат шаблон, затем поменяйте местами 'x' шаблон и снова удерживайте буфер, затем скопируйте буфер шаблонов в буфер хранения 'h', добавьте ветвь 'b' в конец сценария и загрузите следующую строку.

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

0
sed 's/[^country]*//2' <old >new

Это должно изменить все экземпляры страны, кроме первого (если у вас два в первой строке, будет сохранен только первый).

0

если /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 или b , что делает bsd sed счастливым.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .