Regex 在XML文件中用双引号替换字符串

Regex 在XML文件中用双引号替换字符串,regex,perl,sed,awk,pattern-matching,bash,Regex,Perl,Sed,Awk,Pattern Matching,Bash,我有一个巨大的XML文件,每行长5000-10000个字符,文本如下: Pattern="abc" 我想用 Pattern="def" 由于线路尺寸很大,我别无选择,只能使用awk。请建议如何实现这一目标。我尝试了以下方法,但不起作用: CMD="{sub(\"Pattern=\"abc\"\",\"Pattern=\"def\"\"); print}" echo "$CMD" awk "$CMD" "Some File Name.xml" 非常感谢您的帮助。我不明白您为什么说,因为生产线

我有一个巨大的XML文件,每行长5000-10000个字符,文本如下:

Pattern="abc"
我想用

Pattern="def"
由于线路尺寸很大,我别无选择,只能使用awk。请建议如何实现这一目标。我尝试了以下方法,但不起作用:

CMD="{sub(\"Pattern=\"abc\"\",\"Pattern=\"def\"\"); print}"
echo "$CMD"
awk "$CMD" "Some File Name.xml"

非常感谢您的帮助。

我不明白您为什么说,因为生产线很大,我别无选择,只能使用awk。AFAIK sed在线路长度上的限制并不比awk更大,因为这是一个简单的单线替代,sed是更好的工具选择:

$ cat file
Pattern="abc"
$ sed -r 's/(Pattern=")[^"]+/\1def/' file
Pattern="def"
如果图案在线条上出现多次,则在线条末端添加一个g

由于您在评论中提到无法处理长线的sed,我们假设您无法安装GNU工具,因此您需要一个非GNU awk解决方案,如下所示:

$ awk '{sub(/Pattern="[^"]+/,"Pattern=\"def")}1' file
Pattern="def"
如果您的字面意思是只想替换Pattern=abc,那么只需执行以下操作:

$ awk '{sub(/Pattern="abc"/,"Pattern=\"def\"")}1' file
Pattern="def"

我不明白你为什么说,因为生产线很大,我别无选择,只能使用awk。AFAIK sed在线路长度上的限制并不比awk更大,因为这是一个简单的单线替代,sed是更好的工具选择:

$ cat file
Pattern="abc"
$ sed -r 's/(Pattern=")[^"]+/\1def/' file
Pattern="def"
如果图案在线条上出现多次,则在线条末端添加一个g

由于您在评论中提到无法处理长线的sed,我们假设您无法安装GNU工具,因此您需要一个非GNU awk解决方案,如下所示:

$ awk '{sub(/Pattern="[^"]+/,"Pattern=\"def")}1' file
Pattern="def"
如果您的字面意思是只想替换Pattern=abc,那么只需执行以下操作:

$ awk '{sub(/Pattern="abc"/,"Pattern=\"def\"")}1' file
Pattern="def"
一个建议

一个建议

如果有,您可以尝试以下方法:

创建长行>10_000字符的文件:

for((i=0;i<2500;++i));{ s="x$s";}
l="${s}Pattern=\"abc\"$s"
for i in {1..5}; { echo "$l$l";} >infile
剧本:

while read x; do echo "${x//Pattern=\"abc\"/Pattern=\"def\"}";done <infile
这将替换每行中所有出现的Pattern=abc到Pattern=def。

如果有,可以尝试以下操作:

创建长行>10_000字符的文件:

for((i=0;i<2500;++i));{ s="x$s";}
l="${s}Pattern=\"abc\"$s"
for i in {1..5}; { echo "$l$l";} >infile
剧本:

while read x; do echo "${x//Pattern=\"abc\"/Pattern=\"def\"}";done <infile

这将替换每行中所有出现的Pattern=abc到Pattern=def。

不要尝试将awk脚本放入变量中,然后将其传递给awk,这总是100%错误的方法。awk{sub\Pattern=\abc\,\Pattern=\def\;print}某些文件名.xml不起作用!很好,那么您的awk没有损坏。千万不要尝试将awk脚本放入变量中,然后将其传递给awk,这总是100%错误的方法。awk{sub\Pattern=\abc\\,\Pattern=\def\\;print}某些文件名.xml不起作用!很好,那么你的awk没有坏。谢谢你的回复。我使用的是传统的unix平台,而不是linux,在linux中,sed无法操作大于特定大小的行。我知道sed是最简单的。但是,结果是跳过了大的行。所以,我开始寻找awk方法。我添加了一个awk解决方案。如果您使用的是Solaris,请不要使用/bin/awk,因为这是旧的、已损坏的awk-请使用/usr/xpg4/bin/awk或nawk。这样您就不会遇到我提到的Solaris问题。这是我的文件内容行2很长。$cat-n t1.xml 1 Value=abc 2 some text Pattern=abc some text 3 Type=0 4 Pattern=/abc/xyzTrial-1:使用gsubfind,替换$/usr/bin/nawk{gsub\Pattern=\abc\\,\Pattern=\def\\;print}t1.xml Value=abc some text Pattern=abc some text Type=abc text Type=0 Pattern=/abc/xyztanks以获得回复。我使用的是传统的unix平台,而不是linux,在linux中,sed无法操作大于特定大小的行。我知道sed是最简单的。但是,结果是跳过了大的行。所以,我开始寻找awk方法。我添加了一个awk解决方案。如果您使用的是Solaris,请不要使用/bin/awk,因为这是旧的、已损坏的awk-请使用/usr/xpg4/bin/awk或nawk。这样您就不会遇到我提到的Solaris问题。这是我的文件内容行2很长。$cat-n t1.xml 1 Value=abc 2 some text Pattern=abc some text 3 Type=0 4 Pattern=/abc/xyzTrial-1:使用gsubfind,替换$/usr/bin/nawk{gsub\Pattern=\abc\\,\Pattern=\def\\;print}t1.xml Value=abc some text Pattern=abc some text Type=abc text Type=0 Pattern=/abc/xyz