sed在下一行中复制子字符串
我有一个 .po 文件,如果 msgstr 为空,我需要将 msgid 值复制到 msgstr 值中。
例如
msgid "Hello"
msgstr ""
msgid "Dog"
msgstr "Cane"
应该成为
msgid "Hello"
msgstr "Hello"
msgid "Dog"
msgstr "Cane"
目前,出于测试目的,我正在处理另一个文件,但最终脚本将内联工作。
#!/bin/bash
rm it2.po
sed $'s/^msgid.*/&n---&/' it.po > it2.po
sed -i '/^msgstr/d' it2.po
sed -i 's/^---msgid/msgstr/' it2.po
这个脚本有两个问题(至少):
- 当 msgstr 不为空时,也将 msgid 复制到 msgstr 中;
- 我很确定存在一行或更优雅的解决方案。
任何帮助,将不胜感激。提前致谢。
回答
您可以考虑更好的工具gnu awk而不是sed:
awk -i inplace -v FPAT='"[^"]*"|S+' '$id != "" && $1 == "msgstr" && (NF==1 || $2 == """") {$2=id} $1 == "msgid" {id=$2} 1' file
msgid "Hello"
msgstr "Hello"
msgid "Dog"
msgstr "Cane"
-v FPAT='"[^"]*"|S+' 使带引号的字符串或任何非空白字段成为单个字段。
更易读的形式:
awk -i inplace -v FPAT='"[^"]*"|S+' '
$id != "" && $1 == "msgstr" && (NF==1 || $2 == """") {$2=id}
$1 == "msgid" {id=$2}
1' file