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