搜索跨越 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>
标题可能有点模糊,但我有一个包含类似内容的文件
<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>