sed, чтобы соответствовать многострочному диапазону и заменить - PullRequest
3 голосов
/ 09 апреля 2020

У меня есть файл ниже

next: 
    {
     host = "http://nxt-newepisode.xcfm.crata.dive.com/err1.2.2/table/kenny.xml.gz"
    };

second:
   {
     host = "http://nxt-secondepisode.xcfm.crata.dive.com/err1.2.2/table/kenny.xml.gz"
    };

Я хочу заменить URL на основе nxt:{ host = "" и second: { host = "". Как я могу отфильтровать это, используя sed с многострочным соответствием, так как они на нескольких строках?

Я пытался:

sed -i '/second : {\rhost/s#"http://.*"#"next.com"#' file.txt

Это не работает. Я использую \r для новой строки, но я также пытался \n.

Ответы [ 2 ]

3 голосов
/ 09 апреля 2020

Если мы можем предположить, что у вас есть URL во второй строке ниже second:, вы можете использовать

sed -i '/second:/{N;N;s#"http://.*"#"next.com"#}' file

См. Это онлайн sed демо .

N добавляет новую строку, а затем следующую строку в пространство шаблона. Итак, команда s ubstitute выполняется для следующего текста:

second:
   {
     host = "http://nxt-secondepisode.xcfm.crata.dive.com/err1.2.2/table/kenny.xml.gz"

Если неизвестно, какая именно это строка, вы можете l oop, прежде чем найдете лиона, который начинается с 0 + пробелы, затем host =, и только после этого выполните подстановку:

sed -i '/second:/{:a;n;/^ *host *=/!ba;s#"http://.*"#"next.com"#}' file

См. online sed demo .

Здесь,

  • /second:/ - если строка содержит second:
  • :a - установить метку с именем a
  • n - сбросить текущее пространство шаблона и прочитать следующая строка в нем
  • /^ *host *=/!ba - если строка не (!) начинается с 0+ пробелов, host, 0+ пробелов, =, затем go back (b) для маркировки a позиция
  • s#"http://.*"#"next.com"# - выполнить подстановку.

Буквенные пробелы можно заменить на [[:space:]]*, [[:blank:]]* или \s* для соответствия любой пробел в зависимости от того, что работает в вашем sed.

0 голосов
/ 09 апреля 2020

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

sed -E ':a;/^second:/{:b;n;/^\S+:/ba;/(^\s*host = ")[^"]*/s##\1newUrl#;Tb}' file

Замена нового URL-адреса ограничена разделом second:.

При обнаружении другого раздела обработка повторяется.

В пределах раздела second: ищется строка, начинающаяся с host = ", и заменяется значение в двойных кавычках.

В противном случае процесс повторяется до тех пор, пока не будет выполнено указанное выше условие или конец файла.

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