用 bash 内自己的内容替换字符串
Replace string with own contents within 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(因为速度)
如果可以接受 Perl 解决方案:
perl -pe 's/,____([^,]+)$// or next; my $x = ; s/$LANG\b/#$x/g'
如果您可以更改输入,使其在最后一个字段中没有这四个下划线,它会稍微简化代码(只需从第一个正则表达式中删除 ____
)。
想法:
对于每个输入行,匹配最后一个字段(逗号,后跟四个下划线,后跟一个或多个 non-comma 字符,后跟行尾)并将其删除(替换为空).如果此替换失败,则保留该行并转到下一行。
如果替换成功,则在</code>中捕获被删除字段的内容(减去四个前导下划线)并将值复制到<code>$x
中用于下一次替换。
然后再次扫描剩余的行,并将每个出现的 $LANG
替换为单词(即不是 $LANGS
或 $LANGUAGE
),然后是 #
,然后提取的字符串 $x
.
$ awk 'BEGIN{FS=OFS=","} {sub(/^_+/,"#",); gsub(/$LANG/,); print , }' 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
给定一个具有以下格式的大文件(~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(因为速度)
如果可以接受 Perl 解决方案:
perl -pe 's/,____([^,]+)$// or next; my $x = ; s/$LANG\b/#$x/g'
如果您可以更改输入,使其在最后一个字段中没有这四个下划线,它会稍微简化代码(只需从第一个正则表达式中删除 ____
)。
想法:
对于每个输入行,匹配最后一个字段(逗号,后跟四个下划线,后跟一个或多个 non-comma 字符,后跟行尾)并将其删除(替换为空).如果此替换失败,则保留该行并转到下一行。
如果替换成功,则在</code>中捕获被删除字段的内容(减去四个前导下划线)并将值复制到<code>$x
中用于下一次替换。
然后再次扫描剩余的行,并将每个出现的 $LANG
替换为单词(即不是 $LANGS
或 $LANGUAGE
),然后是 #
,然后提取的字符串 $x
.
$ awk 'BEGIN{FS=OFS=","} {sub(/^_+/,"#",); gsub(/$LANG/,); print , }' 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