Есть ли какой-нибудь способ удалить первое появление pattern с помощью sed? - PullRequest
0 голосов
/ 01 декабря 2011

Это тестовый файл:

xxx
hello 
hello 
others

Я хочу использовать sed:

sed -i '/hello/d' the_test_file

Это удалит все строки, содержащие «привет», так как просто удалить первую строку, содержащую «привет»?

Я думаю, что sed не может этого сделать, но с помощью Perl я могу. это как:

perl -00 -pe "s/hello//" the_test_file > /tmp/file && mv /tmp/file the_test_file

Ответы [ 4 ]

2 голосов
/ 01 декабря 2011

Показать исходное содержимое файла.

cat the_test_file
1
2
3
popo
hello 1
hello 2
others

Показать результат после выполнения команды sed

sed -e '0,/^hello/{//d;}' the_test_file
1
2
3
popo
hello 2
others

Чтобы окончательно ответить на ваш вопрос

ПРИМЕЧАНИЕ:благодаря джайпалу

sed -i"bak" -e '0,/^hello/{//d;}' the_test_file
1 голос
/ 09 февраля 2017

убрать первый привет

sed -e "/hello/ N;n;d;" the_test_file

убрать второй привет

sed -e "/hello/ N;n;n;d;" the_test_file

Если имеется более 2 строк приветствия подряд, и вы хотите сохранить первый привет и удалить остальные

sed -e ":loop" -e "/hello/ N; s/\(hello.*\)\n\(hello.*\)/\1/" -e "t loop" the_test_file

Если существует более 2 строк приветствия подряд и вы хотите сохранить только последний привет

sed -e ":loop" -e "/hello/ N; s/\(hello.*\)\n\(hello.*\)/\2/" -e "t loop" the_test_file

the_test_file

xxx
hello1
hello2
hello3
others
0 голосов
/ 01 декабря 2011

Это делает трюк (но не обобщает легко):

$ sed -e '1,/hello/p' -e '1,/hello/d' -e '/hello/d' <<!
> xxx
> hello 
> hello 
> others
!
xxx
hello 
others
$

Логика состоит в том, чтобы вывести строки из строки 1 в первую строку, содержащую «привет»;затем удалите эти строки (чтобы автоматическая печать не выполнялась);после этого просто удалите строки, соответствующие 'hello'.

0 голосов
/ 01 декабря 2011

awk решение:

$ cat file
something
hello 1
else
hello 2
others
hello 3

$ awk '/hello/ && ++c==1{next}1' file
something
else
hello 2
others
hello 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...