regex - 在正则表达式中使用带有换行符的 sed

标签 regex linux bash sed newline

我用这个把头撞在墙上。如何使用 sed 对包含换行符的文本进行正则表达式替换?

我需要替换下面显示的“version”XML 元素的值。有多个版本元素,所以我想替换“名称”元素之后的那个。

<name>MyName</name>
<version>old</version>

这是我的命令:

sed -i -E "s@(\s*<name>$NAME</name>\n\s*<version>)$VERSION_OLD(</version>)@\1$VERSION_NEW\2@g" $myfile.txt

据我所知,现在有一种方法可以使 sed 使用换行符,但我想不通。我已经在我的脚本中使用了 sed,所以理想情况下我更愿意重新使用它而不是说 perl

最佳答案

当您看到 name 元素时,您需要使用 N 命令来读取下一行:

文件:

<bar>MyName</bar>
<version>old</version>
<name>MyName</name>
<version>old</version>
<foo>MyName</foo>
<version>old</version>

使用 GNU sed:

sed '/<name>/{N;s/old/newer/}' file

输出:

<bar>MyName</bar>
<version>old</version>
<name>MyName</name>
<version>new</version>
<foo>MyName</foo>
<version>old</version>

关于regex - 在正则表达式中使用带有换行符的 sed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33655852/

相关文章:

java - 用于从完整文件位置提取路径的正则表达式

string - 使用循环将变量列表与文件名串在一起

linux - 如何在 Bash 中从文件创建用户?

linux - 使用 sed 查找和替换带有 2 个分隔符的字符的好方法

linux - 线程间的上下文切换

检查用户输入的字符串在 C 中的格式是否为 "%d/%d/%d/%d/%d"

Linux 在匹配模式前后添加新行

regex - 在 Hive 表中以 CSV 格式加载数据

Javascript RegEx 和 XMLHttpRequest

php - 用于解析带参数的方法的正则表达式