使用 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】:您可以试试这个sed
或awk
,尽管为这项工作制作的工具可能会更好。
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 匹配段落并替换为新段落 [重复]的主要内容,如果未能解决你的问题,请参考以下文章