首页 > 解决方案 > 在bash中用自己的内容替换字符串

问题描述

给定一个具有以下格式的大文件(~1.000.000 行):

1.xml:LINK-ID-12$LANG,LINK-ID-242$LANG,____de-DE
2.xml:LINK-ID-323$LANG,LINK-ID-122$LANG,____en-GB

处理后的结果应该是

1.xml:LINK-ID-12#de-DE,LINK-ID-242#de-DE
2.xml:LINK-ID-#en-GB,LINK-ID-122#en-GB

一行中的最后一个元素始终包含语言。此元素的格式可以自由选择,出于演示目的,它是____<LANG>.

用语言替换的占位符$LANG也可以自由选择。

删除数组中的最后一个条目并不是什么大问题,我真的在寻找替换的解决方案..

如果可能的话,我正在寻找一个不需要 bash 来遍历整个文件的解决方案,也许是 awk/sed/grep 的东西(因为速度)

标签: regexbashawksedtext-processing

解决方案


如果 Perl 解决方案是可接受的:

perl -pe 's/,____([^,]+)$// or next; my $x = $1; s/\$LANG\b/#$x/g'

如果您可以更改输入,使其在最后一个字段中没有这四个下划线,它将稍微简化代码(只需____从第一个正则表达式中删除)。

主意:

对于每个输入行,匹配最后一个字段(一个逗号,后跟四个下划线,后跟一个或多个非逗号字符,然后是行尾)并将其删除(替换为空)。如果此替换失败,则保持该行不变并转到下一行。

如果替换成功,则捕获已删除字段的内容(减去四个前导下划线)$1并将值复制到$x中以进行下一次替换。

然后再次扫描剩余的行,并用 a 替换每个出现的$LANG单词(即 not$LANGS$LANGUAGE#,然后是提取的字符串$x


推荐阅读