【问题标题】:how to insert text between strings on two successive lines with awk如何使用awk在两个连续行的字符串之间插入文本
【发布时间】:2022-01-16 04:39:09
【问题描述】:

我有一个 yaml 文件,其中缺少一些行(示例下的源和目标:),其中下面的 word1 需要修复,但 word2 没问题。

 - dyu: word1
    alt:
    trans:
      - lang: fr
        detail: null
        speech:
          - type: null
            def:
              - gloss: gloss1
                note: null
                example:
  - dyu: word2
    alt:
    trans:
      - lang: fr
        detail: null
        speech:
          - type: null
            def:
              - gloss: gloss2
                note: null
                example:
                  - source: some example source
                    target: some example target
  - dyu: word3

我已使用以下内容插入缺失的文本:

awk -i inplace -v data="                  - source:\n                    target:" '/example:/ {f=1} /- dyu:/ && f {print data; f=0}1' $file 

但问题是即使文本存在,它也会插入文本。我需要在example:\n - dyu 之间添加缺少的文本完全,而不是在target: something\n -dyu. 之间添加

期望的输出:

 - dyu: word1
    alt:
    trans:
      - lang: fr
        detail: null
        speech:
          - type: null
            def:
              - gloss: gloss1
                note: null
                example:
                  - source: 
                    target: 
  - dyu: word2
    alt:
    trans:
      - lang: fr
        detail: null
        speech:
          - type: null
            def:
              - gloss: gloss2
                note: null
                example:
                  - source: some example source
                    target: some example target
  - dyu: word3

我怎样才能做到这一点?

【问题讨论】:

    标签: awk


    【解决方案1】:

    这可能是您正在寻找的:

    awk -v data='                  - source:\n                    target:' \
        'f { if (/- dyu:/) print data; f=0 } /example:/ {f=1} 1
         END { if (f) print data }' file
    

    【讨论】:

      【解决方案2】:
      $ cat tst.awk
      example != "" {
          if ( !/- source:/ ) {
              sub(/[^[:space:]].*/,"",example)
              print example "  - source:"
              print example "    target:"
          }
          example = ""
      }
      $1=="example:" {
          example = $0
      }
      { print }
      

      $ awk -f tst.awk file
       - dyu: word1
          alt:
          trans:
            - lang: fr
              detail: null
              speech:
                - type: null
                  def:
                    - gloss: gloss1
                      note: null
                      example:
                        - source:
                          target:
        - dyu: word2
          alt:
          trans:
            - lang: fr
              detail: null
              speech:
                - type: null
                  def:
                    - gloss: gloss2
                      note: null
                      example:
                        - source: some example source
                          target: some example target
        - dyu: word3
      

      如果您愿意,请将正则表达式 !/- source:/ 更改为 /- dyu:/,脚本将与您的示例输入行为相同,但恕我直言,这不如仅测试 sourceexample 之后是否存在。

      【讨论】:

        猜你喜欢
        • 2017-05-25
        • 2015-11-10
        • 1970-01-01
        • 1970-01-01
        • 2017-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-07
        相关资源
        最近更新 更多