1

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

Pattern="abc"

我想用

Pattern="def"

由于行的大小很大,我别无选择,只能使用 awk。请建议如何实现这一点。我尝试了以下方法,但它不起作用:

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

非常感谢任何帮助。

4

3 回答 3

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"
于 2013-06-17T13:02:55.387 回答
2

的一项建议

BEGIN {FS="\""; OFS=""}
/Pattern="abc"/{$2="\"def\""}1
于 2013-06-17T13:48:58.763 回答
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"to Pattern="def"

于 2013-06-17T14:02:59.893 回答