首页 > 解决方案 > 用 sed 替换多个文件中的一个事件

问题描述

我有超过 30 个文件,我必须替换该事件

msgstr ""之前msgid "(aged %s)

根据内容

msgstr "..."属于第一次出现msgid "(aged %s)

所有文件都位于目录中resources/

resources
   lang-fr
       file.po
   lang-ge
       file.po
   lang-it
       file.po
   

msgid "(aged %s)如果这可以帮助每个文件只有 3 次出现。

文件:file.po

...
...
msgid "(aged %s)
msgstr "good translation %s"
...
...
msgid "(aged %s)
msgstr ""
...
....
msgid "(aged %s)
msgstr ""
....
....

预期结果:

文件:file.po

....
...
msgid "(aged %s)
msgstr "good translation %s"
...
...
msgid "(aged %s)
msgstr "good translation %s"
...
....
msgid "(aged %s)
msgstr "good translation %s"
....
....

我花了几个小时尝试使用 sed,但我被卡住了。

标签: sed

解决方案


使用一个 shell 变量和两个实例sed

r="$(sed -n '/^msgid "(aged %s)$/{n;s/^[^"]*"//p;q}' file.po)"
sed '/^msgid "(aged %s)$/{n;s/\(^msgstr "\)"$/\1'"$r"'/}' file.po 

第一次运行后sed,变量$r将包含good translation %s". 下sed一遍查找""并将其替换为$r.

如果没有变量,它也可以做得更丑:

sed '/^msgid "(aged %s)$/{n;s/\(^msgstr "\)"$/\1'"$(sed -n '/^msgid "(aged %s)$/{n;s/^[^"]*"//p;q}' file.po)"'/}' file.po

另请参阅Baeldung的有用调查Using sed to Replace a Multi-Line String


推荐阅读