Regex sed匹配多行范围并替换

Regex sed匹配多行范围并替换,regex,sed,Regex,Sed,我有下面的文件 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" }; 我想替换基于nxt:{host=”“和second:{ho

我有下面的文件

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"
    };
我想替换基于
nxt:{host=”“
second:{host=”“
的url。如何使用多行匹配的sed筛选此url,因为它们位于多行上

我试过:

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

它不起作用。我正在为新行使用
\r
,但我也尝试了
\n

如果我们可以假设您在下面的第二行有URL
第二行:
您可以使用

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


N
将换行符和后续行追加到模式空间。因此,对以下文本运行
s
substitute命令:

second:
   {
     host = "http://nxt-secondepisode.xcfm.crata.dive.com/err1.2.2/table/kenny.xml.gz"
如果不知道它到底是哪一行,您可以在找到以0+空格开头的lione之前循环,然后
host=
,然后才运行替换:

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

这里,

  • /second:///code>-一旦一行包含
    second:
  • :a
    -设置名为
    a
  • n
    -丢弃当前图案空间,并将下一行读入其中
  • /^*主机*=/!ba
    -如果行没有(
    )以0+空格开始,
    主机
    ,0+空格,
    =
    ,然后返回(
    b
    )标记
    a
    位置
  • s#“http://.*”#“next.com”#
    -运行替换
文字空格可以替换为
[[:space:][]*
[[:blank:][]*
\s*
以匹配任何空格,具体取决于在
sed

中工作的内容这可能适用于您(GNU sed):

新url的替换仅限于
second:
部分

遇到另一部分时,重复处理

second:
部分中,将查找以
host=“
开头的行,并替换双引号中的值


否则将重复该过程,直到满足上述任一条件或文件结束。

Try
sed-i'/second://{N;N;s#“http://.#“next.com”#'file
。这假设您在下面的第二行有URL
第二:
谢谢。将尝试。N和N是什么意思sed命令
N
将下一行输入追加到当前匹配的行。
N;N
执行两次。
放在两个命令之间。
N
追加新行和然后,在模式空间的下一行上运行
s
substitute命令:{host='http://nxt-secondepisode.xcfm.crata.dive.com/err1.2.2/table/kenny.xml.gz“
text。请告知此结构是否已修复,我们可能会利用此结构。感谢您的帮助。您可以将其作为答案并进行解释。我们是否也可以根据主机关键字进行筛选?
sed -E ':a;/^second:/{:b;n;/^\S+:/ba;/(^\s*host = ")[^"]*/s##\1newUrl#;Tb}' file