sed - 用 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,但我被卡住了。
解决方案
使用一个 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。
推荐阅读
- node.js - 使用 node.js fetch 调用的 API 的行为与使用浏览器不同
- java - 使用 Spring Boot,如何在新表上创建 2 个实体之间的关系并为其提供额外的列?
- python - Django - 即使尝试登录非管理页面,也会自动登录管理页面
- pentaho - 如何从 csv 文件中删除第一行?
- php - 获取街道列表以创建房屋
- python - 无法解析 AWS Lambda 上的主机名
- c++ - 读取输入文件并将它们存储在 C++ 中的 STL 向量中
- python - 为什么不使用 Apache 在我的 Python CGI 脚本中发送电子邮件?
- r - R中的元积分器
- c++ - 在 C++ 中抽象出嵌套循环