sed соответствует нескольким строкам, содержащим специальные символы, и заменяет часть соответствующего шаблона - PullRequest
0 голосов
/ 28 августа 2018

Рассмотрим следующий набор строк в виде текстового файла:

START This is a 
sample paragraph that has special characters like new lines

spaces, tabs, quotes "abc", equals =, angular brackets <abc>, front slash / and might contain the starting string that should be ignored
START and 

END

START

dfgfah

END

Используя sed, я хочу заменить текст только между первым вхождением START и первым вхождением END.

Результат, который я ожидаю, выглядит так:

START new_text END

START

dfgfah

END

То, что я пробовал, выглядит так:

sed ':a;N;$!ba;s/START.*END/START New text END/' sample.txt>sample_2.txt

Но результат был:

START New text End

Как заменить до первого появления END?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

С GNU sed:

sed '0,/START/{:a;/END/!{N;ba};s/.*/START new_text END/;}' file
  • 0,/START/: с первого появления START
  • :a;/END/!{N;ba}: добавлять новые строки в пространство шаблона, пока не будет найдено END
  • когда вышеуказанные циклы заканчиваются, заменить объединенные строки на START new_text END
0 голосов
/ 28 августа 2018

Вы можете использовать : для определения меток и b для перехода к метке в sed скриптах.

Опция -n указывает sed автоматически печатать без строк. Вместо этого вы можете напечатать строки с помощью команды p.

В следующем примере цикл :head зацикливается на детали до первого START, а цикл :tail зацикливается на тексте после первого END. Цикл :start проходит по части между первыми START и END.

Циклы :head и :tail печатают (p) каждую строку (n) и завершают работу, когда достигают конца файла ($q). Цикл :start не печатает, а просто игнорирует содержимое. Когда END найден, новый текст вставляется (s) и печатается (p).

cat <<EOF |
START This is a 
sample paragraph that has special characters like new lines

spaces, tabs, quotes "abc", equals =, angular brackets <abc>, front slash / and might contain the starting string that should be ignored
START and 

END

START

dfgfah

END
EOF
sed -n '
:head
/^START/{
  :start
  n
  $q
  /^END/{
    s/^/START New text /
    p
    n
    :tail
    p
    $q
    n
    b tail
  }
  b start
}
p
$q
n
b head
'

Вышеупомянутая техника взята из первого примера sed урока Geek Stuff .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...