Замена всей строки при удалении новой строки этой конкретной строки

Для меня проблема была связана с тем, что порт не был открыт. Так что я должен был сделать:sudo iptables -A INPUT -p tcp --dport 6379 -j ACCEPT

4
10.05.2021, 07:34
6 ответов

Насколько я понимаю, вы хотите заменить строку, состоящую только из слова thisи следующей за ней новой строки, на test,так

foo
this
this is a test

должно стать

foo
testthis is a test

В sedвы можете просто соединить следующую строку с Nи заменить все до новой строки:

sed '/^this$/{N;s/.*\n/test/;}'
7
28.07.2021, 11:33

Я бы предложил использовать здесь perl, синтаксис не сильно отличается от sedдля этого случая:

$ cat ip.txt
this
this is a test
another test?

$ perl -pe 's/^this\n/XYZ/' ip.txt
XYZthis is a test
another test?
5
28.07.2021, 11:33

Включите это, или, как указали другие, возможно «объединение» строк в sed:

sed ':a;/^this$/{N;s/\n//;ba}' testfile

результат:

thisthis is a test
another test?

Чтобы также сделать замену:

sed 's/^this$/test/g;:a;/^test$/{N;s/\n//;ba}' testfile
testthis is a test
another test?

Взято из этого ответа.

3
28.07.2021, 11:33

Использованиеawk:

awk '/^this$/{$0="test"}1'  file

В этой команде, если шаблон найден, он заменяется на замена.

Осталось удалить новую строку после замены, потому что новая строка все еще существует. printfсделает эту работу потому что в отличие от printэто не добавляет новую строку в конце по умолчанию.

Это:

awk '/^this$/{printf "%s", "test"; next} 1'   file

И это работает.

1
28.07.2021, 11:33

С помощью GNU sed вы можете прочитать все строки в память с помощью -zи выполнить сопоставление оттуда, например.:

sed -z 's/this\n/test/'
5
28.07.2021, 11:33

Один из способов использования awk путем манипулирования разделителем выходных записей:

$ awk '{ ORS = sub(/^this$/,"FOO") ? "" : RS }1' file

$ sed -e '
    $!N
    s/^this\n/FOO/;t
    P;D
' file
2
28.07.2021, 11:33

Теги

Похожие вопросы