【问题标题】:Replacing PO msgstr with original using awk sed linux commands使用 awk sed linux 命令将 PO msgstr 替换为原始的
【发布时间】:2019-07-16 01:43:58
【问题描述】:

我有一个语言文件woocommerce-fr-Fr.po

我正在尝试替换第二行 (msgstr) 与第一行 (msgid ) 类似。

之前:

msgid "Learn how to upgrade"
msgstr "Apprenez comment mettre à jour"

想要的结果:

msgid "Learn how to upgrade"
msgstr "Learn how to upgrade"

有 som 26000 行,所以手动搜索和替换是不可行的。

这是我的代码尝试:

sed 's/\([^""]*\)msgstr\(.*\)/\1lol\2/' 1.txt

【问题讨论】:

  • 请在您的帖子中添加您为解决您自己的问题所做的努力,然后让我们知道。还要将您的样本包装在 CODE TAGS 中。
  • 抱歉,这不是 StackOverflow 的工作方式。 “我想做 X,请给我提示和/或示例代码”形式的问题被认为是题外话。请访问help center并阅读How to Ask,尤其是阅读Why is “Can someone help me?” not an actual question?
  • 不管有多少行,一旦你找到了正确的脚本,它就会为你完成所有的工作。文件结构是什么?所有行对 msgid/msgstr 还是?
  • 没有woocommerce-en-US.po或类似文件吗??

标签: bash awk sed


【解决方案1】:

sed 不能跨越换行符边界匹配(这不是不可能完成的,但它不平凡而且有点令人沮丧)但是这对于 Awk 来说很容易。

awk '$1 == "msgid" { s=$0; sub(/msgid/, "msgstr", s); print; print s; next }
    $1 == "msgstr" { next }
    1' woocommerce-fr-Fr.po >new.po

当我们看到msgid 时,我们打印它,然后打印一个修改后的行,我们将msgid 替换为msgstr。我们跳过任何剩余的msgstr 行。其他任何内容都会逐字传递。

【讨论】:

    【解决方案2】:
    $ awk 'NR%2{print; sub(/[^ ]+/,"msgstr"); print}' file
    msgid "Learn how to upgrade"
    msgstr "Learn how to upgrade"
    

    【讨论】:

    • 如果文件只包含交替的msgidmsgstr 行而没有其他内容(甚至没有空行),这可以正常工作,但实际上可能并非如此。 (可以说 OP 应该提供更好的输入文件代表性样本。)
    • 有很多事情可能会有所不同,所以直到如果/当 OP 告诉我们否则我只是假设发布的示例输入/输出真正代表他们的真实数据。如果有任何不同,无论如何这将是对脚本的微不足道的调整。
    【解决方案3】:

    GNU sed 解决方案:

    sed '/^msgid "\([^"]*\).*/{N;s//msgid "\1"\nmsgstr "\1"/;}'
    

    您需要使用 POSIX sed

    sed '/^msgid "\([^"]*\).*/{N;s//msgid "\1"\'$'\n''msgstr "\1"/;}'
    

    如果一行以msgid 开头,则读取下一行,提取第一对" 之间的部分,并输出带有msgid 和msgstr 的格式化输出。在repl 测试。

    【讨论】:

      猜你喜欢
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      • 2022-01-10
      相关资源
      最近更新 更多