找到匹配的文本并替换下一行

bsw*_*ton 35 linux sed

我正在尝试在文件中找到一行,并用特定值替换下一行.我试过sed,但似乎不喜欢\n.怎么办呢?

该文件如下所示:

<key>ConnectionString</key>
<string>anything_could_be_here</string>
Run Code Online (Sandbox Code Playgroud)

我想把它改成这个

<key>ConnectionString</key>
<string>changed_value</string>
Run Code Online (Sandbox Code Playgroud)

这是我试过的:

sed -i '' "s/<key>ConnectionString<\/key>\n<string><\/string>/<key>ConnectionString<\/key>\n<string>replaced_text<\/string>/g" /path/to/file
Run Code Online (Sandbox Code Playgroud)

pot*_*ong 39

这可能适合你(GNU sed):

sed '/<key>ConnectionString<\/key>/!b;n;c<string>changed_value</string>' file
Run Code Online (Sandbox Code Playgroud)

  • @ffledgling,`!b`否定前一个地址(regexp)并中断任何处理,结束sed命令,`n`打印当前行,然后读取下一个进入模式空间,`c`改变当前行到命令后面的字符串. (9认同)
  • 如果有任何osx用户感兴趣,可以使用sed的gsed insted使其工作(通过macport或“ brew install gnu-sed”安装) (2认同)
  • 您能在这里细分`!b` n`和`c`吗? (2认同)

Gur*_*uru 35

一种方法:样本文件

$ cat file
Cygwin
Unix
Linux
Solaris
AIX
Run Code Online (Sandbox Code Playgroud)

使用sed,将模式'Unix'替换为'hi'后的下一行:

$ sed '/Unix/{n;s/.*/hi/}' file
Cygwin
Unix
hi
Solaris
AIX
Run Code Online (Sandbox Code Playgroud)

针对您的具体问题:

$ sed '/<key>ConnectionString<\/key>/{n;s/<string>.*<\/string>/<string>NEW STRING<\/string>/}' your_file
<key>ConnectionString</key>
<string>NEW STRING</string>
Run Code Online (Sandbox Code Playgroud)

  • @bswinnerton在OS X上遇到同样的问题,这个提示帮助:http://stackoverflow.com/a/4904510/479478.所以基本上你需要将花括号分成几块:``sed -i''-e'/ <key> ConnectionString <\/key>/{'-e'n; s/<string>.*<\/string>/<string>已更改<\/string> /'-e'}'your_file`` (7认同)
  • @EricChen,这太神奇了......我不知道它是如何工作的(或者更好地说为什么)......但确实如此! (2认同)

小智 6

有用。另外有兴趣提到,如果你写,

sed '/<key>ConnectionString<\/key>/!b;n;n;c<string>changed_value</string>' file
Run Code Online (Sandbox Code Playgroud)

请注意两个 n,它会在两行之后替换,依此类推。

  • @Mausy5043 `-i` 不会抑制输出。那是内联替换标志。该标志允许您直接修改文件。 (6认同)
  • 这是描述使用“-i”效果的**非常**糟糕的方式,因为“修改原始文件”是比“抑制输出”更重要的效果。如果某些内容将改变您的文件,那么了解这一点很重要(错误的“sed”命令可能会导致您丢失数据)。 (6认同)