搜索跨越 2 个字符串之间的多行且不包含不同字符串的模式,然后替换为新值

Search for a pattern spanning multiple lines between 2 strings and does not include a different string, then replace with new value

标题可能有点模糊,但我有一个包含类似内容的文件

<Tag>
 <Tag 
    111
    222
 />
</Tag>

使用bash 脚本(grep、sed、awk 等)我想搜索内部标签并用一些新内容替换它

 <Tag>
     <Tag 
        333
        444
     />
    </Tag>

新内容可以全部在一行,即<Tag 333 444 /> 我正在为如何仅搜索内部标签而苦苦挣扎,我找不到一种方法来提取以 <Tag 开头并以 /> 结尾但不包含 > 的字符串.任何帮助将不胜感激。

如果对 -E-z 使用 GNU sed,这不是您所需要的,那么请编辑您的问题以提供更具代表性的示例 input/output,包括您拥有的案例这不适用于:

$ sed -Ez 's:<Tag[^<>]+/>:<Tag 333 444 />:' file
<Tag>
 <Tag 333 444 />
</Tag>

我会按照以下方式使用 GNU AWK 完成此任务,令 file.txt 内容为

<Tag>
 <Tag 
    111
    222
 />
</Tag>

然后

awk 'BEGIN{RS=""}{sub(/<Tag[^>]*\/>/,"<Tag 333 444 />")}{print}' file.txt

产出

<Tag>
 <Tag 333 444 />
</Tag>

说明:我将 RS 设置为空行,因此通知 GNU AWK 它应该将空行视为分隔行。对于给定的示例文件,只有一行。使用 sub string function 替换第一次出现的 <Tag 后跟零个或多个 (*) 非 > 后跟 />/ 必须是转义,否则会终止表达式)。使用提供的替换。与是否进行替换无关 print免责声明:我假设您的文件没有空行。

(在 gawk 4.2.1 中测试)

你的意思是这样的?

 echo "${aaaa}" \
                 \
 | mawk 'BEGIN { RS=(ORS=_)"^$"
                 FS=(OFS="<Tag")"[^"(_="/>")"]+"_
                     OFS=(OFS)" 333 444 "_ } NF=NF'
<Tag>
 <Tag 333 444 />
</Tag>