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

时间:2013-06-17 12:56:00

标签: regex perl sed awk pattern-matching

我有一个包含更长行(每行5000-10000个字符)的大型XML文件,其中包含以下文本:

Pattern="abc"

我想用

替换它
Pattern="def"

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

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

我不明白为什么你说“由于线路尺寸很大,我别无选择,只能使用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"

答案 1 :(得分:2)

的一个建议
BEGIN {FS="\""; OFS=""}
/Pattern="abc"/{$2="\"def\""}1

答案 2 :(得分:0)

如果您有,可以试试这个:

使用长行创建文件(> 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"的所有出现次数。