使用 sed/awk/grep 匹配段落并替换为新段落 [重复]

Posted

技术标签:

【中文标题】使用 sed/awk/grep 匹配段落并替换为新段落 [重复]【英文标题】:Match paragraph and replace with new paragraph using sed/awk/grep [duplicate] 【发布时间】:2021-10-12 04:39:19 【问题描述】:

我想匹配文件中的多条连续线,然后用新的多条连续线替换它。例如:

图案:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

替换为:

<Connector port="8080" protocol="HTTP/1.1"
        connectionTimeout="20000"
         acceptCount="450" maxConnections="10000"
           redirectPort="8443" server=" " />

尽管在这两个段落中很少有关键字是共同的,但只是认为它们不同。

我尝试了以下但未能成功:

sed -i 's/<Connector port="8080" protocol="HTTP\/1.1" \nconnectionTimeout="20000" \nredirectPort="8443" \/>/<Connector port="8080" protocol="HTTP\/1.1" \nconnectionTimeout="20000" \nacceptCount="450" maxConnections="10000" \nredirectPort="8443" server=" " \/>/g' server.xml

我怎样才能达到上述目的。

谢谢。

【问题讨论】:

这不是一个段落,它是一个 XML 标记。使用能够理解 XML 并旨在对其进行操作的工具。 感谢肖恩的及时回复。但我想用 sed 或 awk 或 grep 来做。我们可以在没有任何 XML 工具的情况下做到这一点吗? Don't Parse XML/html With Regex. 我建议使用 XML/HTML 解析器 (xmlstarlet, xmllint ...)。 想要使用 sed 之类的东西来处理 XML 就像用锤子敲螺丝一样。为工作使用正确的工具。 如果你想使用大多数专业人士认为完全不适合这项任务的工具,至少解释一下你为什么要这样做。请记住,我们每天都会看到很多人想知道如何处理无效 XML 的帖子,这是人们使用错误工具生成 XML 的必然结果。 【参考方案1】:

您可以试试这个sedawk,尽管为这项工作制作的工具可能会更好。

sed -E '/[a-zA-Z]*."20000"/ N;s|[a-z]*"8443".*|acceptCount="450" maxConnections="10000"\n\t\tredirectPort="8443" server=" " />|'
awk 'NR==3$0="\t\tacceptCount=\"450\" maxConnections=\"10000\"\n\t\tredirectPort=\"8443\" server=\" \"/>"1'

【讨论】:

【参考方案2】:

sed 的选项-z 允许轻松替换多行块:

sed -E -z 's!(<Connector port="8080" protocol="HTTP/1.1"\
\s+connectionTimeout="20000"\
\s+)(redirectPort="8443")!\1acceptCount="450" maxConnections="10000"\
           \2 server=" "!'   inputfile

【讨论】:

以上是关于使用 sed/awk/grep 匹配段落并替换为新段落 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

三剑客之sed,awk,grep,egrep

Linux的文本编辑diff & sed & awk & grep

inux基础命令 sed awk grep 及部分快捷键

Linux文本三剑客--grepsedawk

转帖vim/sed/awk/grep等文件批处理总结

Notes11用swagger开发rest,正则,linux命令sed/awk/grep,Websocket,DNS