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

这个脚本有两个问题(至少):

  1. 当 msgstr 不为空时,也将 msgid 复制到 msgstr 中;
  2. 我很确定存在一行或更优雅的解决方案。

任何帮助,将不胜感激。提前致谢。

回答

您可以考虑更好的工具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


以上是sed在下一行中复制子字符串的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>