我有一个包含更长行(每行5000-10000个字符)的大型XML文件,其中包含以下文本:
Pattern="abc"
我想用
替换它Pattern="def"
由于线路尺寸很大,我别无选择,只能使用awk。请建议如何实现这一目标。我尝试了以下但是它不起作用:
CMD="{sub(\"Pattern=\"abc\"\",\"Pattern=\"def\"\"); print}"
echo "$CMD"
awk "$CMD" "Some File Name.xml"
非常感谢任何帮助。
答案 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)
如果您有bash,可以试试这个:
使用长行创建文件(> 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"
的所有出现次数。