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

Linux 查找匹配的文本并替换下一行,linux,sed,Linux,Sed,我试图在文件中找到一行,并用特定值替换下一行。我尝试了sed,但它似乎不喜欢。否则怎么做呢 该文件如下所示: <key>ConnectionString</key> <string>anything_could_be_here</string> 连接字符串 这里什么都可以 我想换成这个 <key>ConnectionString</key> <string>changed_value</string&g

我试图在文件中找到一行,并用特定值替换下一行。我尝试了sed,但它似乎不喜欢。否则怎么做呢

该文件如下所示:

<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
sed-i''s/ConnectionString\n/ConnectionString\n替换的\u text/g”/path/to/file
单向: 样本文件

$ 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>
$sed'/ConnectionString/{n;s/*/NEW STRING/}您的\u文件
连接串
新字符串
这可能适合您(GNU-sed):

sed'/ConnectionString/!BN“更改的值”文件

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

有效。另外,我想说的是,如果你写信

sed '/<key>ConnectionString<\/key>/!b;n;n;c<string>changed_value</string>' file
sed'/ConnectionString/!BNN“更改的值”文件

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

我得到了
sed:1:“/ConnectionString<…”:替换命令中的错误标志:'}'
当运行
sed'/ConnectionString/{n;s/*/test/}'$HOME/Documents/temp.rdp
@winberton在OS X上遇到了相同的问题,这个提示有帮助:。因此,基本上您需要将花括号拆分成几段:
sed-i'-e'/ConnectionString/{'-e'n;s/*/changed/'-e'}您的_文件
sed-i'-e'/Unix/{'-e'n;s/*/hihi/'-e'}如果有任何osx用户感兴趣,您可以使用gsed代替sed使其工作(使用macport或
brew安装gnu-sed
)你能把什么分解一下吗!b
n
c
在这里做什么?@ffleggling,
!b
否定上一个地址(regexp)并中断任何处理,结束sed命令,
n
打印当前行,然后将下一行读入模式空间,
c
将当前行更改为命令后面的字符串。@txulu天哪,这很有帮助。我在mac电脑上拔头发。@poton哇,谢谢!这正是我所需要的@Mausy5043
-i
不抑制输出。这是内联替换标志。此标志允许您直接修改文件。@DanielOwsley correct以便有效地抑制输出到终端;-)这是一种非常糟糕的方式来描述使用
-i
的效果,因为“修改原始文件”比“抑制输出”更重要。如果有什么东西要改变你需要知道的重要文件(一个错误的
sed
命令可能会导致你丢失数据)。@Mausy5043轻描淡写地使用
sed
,如果你使用
-i
来“抑制”输出,你将毁了你的一年。。。可能会成为新闻。这就像说:使用
rm-rf/
来代替
sleep 20
——两者都会在返回提示之前暂停一段时间。。。但结果却截然不同。