sed 在下一行中复制子字符串

ass*_*bss 6 sed po

我有一个 .po 文件,如果 msgstr 为空,我需要将 msgid 值复制到 msgstr 值中。

例如

msgid "Hello"
msgstr ""

msgid "Dog"
msgstr "Cane"
Run Code Online (Sandbox Code Playgroud)

应该成为

msgid "Hello"
msgstr "Hello"

msgid "Dog"
msgstr "Cane"
Run Code Online (Sandbox Code Playgroud)

目前,出于测试目的,我正在处理另一个文件,但最终脚本将内联工作。

#!/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
Run Code Online (Sandbox Code Playgroud)

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

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

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

anu*_*ava 5

您可以考虑更好的工具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"
Run Code Online (Sandbox Code Playgroud)

-v FPAT='"[^"]*"|\\S+' 使带引号的字符串或任何非空白字段成为单个字段。

更易读的形式:

awk -i inplace -v FPAT='"[^"]*"|\\S+' '
$id != "" && $1 == "msgstr" && (NF==1 || $2 == "\"\"") {$2=id}
$1 == "msgid" {id=$2}
1' file
Run Code Online (Sandbox Code Playgroud)