56

我正在尝试在文件中查找一行并将下一行替换为特定值。我试过sed,但它似乎不喜欢\n。这还能怎么做?

该文件如下所示:

<key>ConnectionString</key>
<string>anything_could_be_here</string>

我想把它改成这个

<key>ConnectionString</key>
<string>changed_value</string>

这是我尝试过的:

sed -i '' "s/<key>ConnectionString<\/key>\n<string><\/string>/<key>ConnectionString<\/key>\n<string>replaced_text<\/string>/g" /path/to/file
4

3 回答 3

63

一种方式:示例文件

$ cat file
Cygwin
Unix
Linux
Solaris
AIX

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

$ sed '/Unix/{n;s/.*/hi/}' file
Cygwin
Unix
hi
Solaris
AIX

对于您的具体问题:

$ sed '/<key>ConnectionString<\/key>/{n;s/<string>.*<\/string>/<string>NEW STRING<\/string>/}' your_file
<key>ConnectionString</key>
<string>NEW STRING</string>
于 2013-09-04T17:29:42.790 回答
55

这可能对您有用(GNU sed):

sed '/<key>ConnectionString<\/key>/!b;n;c<string>changed_value</string>' file

!b否定前一个地址(正则表达式)并中断任何处理,结束 sed 命令,n打印当前行,然后将下一行读入模式空间,c将当前行更改为命令后面的字符串。

于 2013-09-04T20:14:16.853 回答
5

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

sed '/<key>ConnectionString<\/key>/!b;n;n;c<string>changed_value</string>' file

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

于 2016-03-29T15:10:11.260 回答