用bash中自己的内容替换字符串

时间:2019-05-18 13:36:45

标签: regex bash awk sed text-processing

使用以下格式给出一个大文件(〜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(由于速度)

2 个答案:

答案 0 :(得分:0)

如果可以接受Perl解决方案:

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

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

想法:

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

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

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

答案 1 :(得分:0)

$ awk 'BEGIN{FS=OFS=","} {sub(/^_+/,"#",$3); gsub(/\$LANG/,$3); print $1, $2}' file
1.xml:LINK-ID-12#de-DE,LINK-ID-242#de-DE
2.xml:LINK-ID-323#en-GB,LINK-ID-122#en-GB