如何使用awk在两个连续行的字符串之间插入文本

Posted

技术标签:

【中文标题】如何使用awk在两个连续行的字符串之间插入文本【英文标题】:how to insert text between strings on two successive lines with 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=01' $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

我怎样才能做到这一点?

【问题讨论】:

【参考方案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 之后是否存在。

【讨论】:

以上是关于如何使用awk在两个连续行的字符串之间插入文本的主要内容,如果未能解决你的问题,请参考以下文章

当两个或多个连续行具有相同状态时如何选择一行

每个客户的连续行之间的Haversine距离

同一column_python中同一数据帧中两个连续行之间的相关性

如何根据条件在pyspark中跨连续行保留值

如何在 Kotlin 中进行换行(续行)

使用awk,后跟单引号时如何匹配反斜杠字符(是的,这是两个字符)