regex - 在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 = $1; s/\$LANG\b/#$x/g'
如果您可以更改输入,使其在最后一个字段中没有这四个下划线,它将稍微简化代码(只需____
从第一个正则表达式中删除)。
主意:
对于每个输入行,匹配最后一个字段(一个逗号,后跟四个下划线,后跟一个或多个非逗号字符,然后是行尾)并将其删除(替换为空)。如果此替换失败,则保持该行不变并转到下一行。
如果替换成功,则捕获已删除字段的内容(减去四个前导下划线)$1
并将值复制到$x
中以进行下一次替换。
然后再次扫描剩余的行,并用 a 替换每个出现的$LANG
单词(即 not$LANGS
或$LANGUAGE
)#
,然后是提取的字符串$x
。
推荐阅读
- unity3d - Unity中如何改变多个对象的颜色
- java - 在 kotlin 函数中获取地图和收集器错误
- javascript - 如何在 ejs 文件中的 html 代码中以及脚本标记中使用变量?
- kubernetes - 从两个端口到一个入口点的流量?
- javascript - spatie/crawler - 如何获取 javascript 呈现网站的 HTML?
- r - 打印小标题时如何省略数据类型行?
- javascript - 用大括号包围代码是一种好习惯吗?
- c# - 如何使用循环简化 GameObject 按键代码?
- android - 无法在 Oreo (Android 8.0) 及更高版本上弹出通知。我到底做错了什么?
- python - 返回频率元组的列表,我在哪里做错了?