在文件中的两个正则表达式模式之间增量交换行

mar*_*w18 5 sed awk python shell-script

我正在尝试使用 bash 脚本对文件进行一些文本处理。目标是将所有以“field:”开头的行缩进到“attribute:”标签下,并将它们与后面以“- attr:”开头的相关行交换。

到目前为止,我认为我有应该与标签匹配的正则表达式模式:

/ *field:(.*)/g

/ *- attr:(.*)/g

但是我在解析所需字段并使它们正确交换的逻辑方面没有取得任何成功。

示例输入文本

- metric: 'example.metric.1'
  attributes:
      field: 'example 1'
    - attr: 'example1'
      field: 'example 2'
    - attr: 'example2'
      field: 'example 3'
    - attr: 'example3'
      field: 'example 4'
    - attr: 'example4'
- metric: 'example.metric.2'
  attributes:
      field: 'example 5'
    - attr: 'example5'
      field: 'example 6'
    - attr: 'example6'
      field: 'example 7'
    - attr: 'example7'
- metric: 'example.metric.3'
...
Run Code Online (Sandbox Code Playgroud)

期望输出

- metric: 'example.metric.1'
  attributes:
    - attr: 'example1'
      field: 'example 1'
    - attr: 'example2'
      field: 'example 2'
    - attr: 'example3'
      field: 'example 3'
    - attr: 'example4'
      field: 'example 4'
- metric: 'example.metric.2'
  attributes:
    - attr: 'example5'
      field: 'example 5'
    - attr: 'example6'
      field: 'example 6'
    - attr: 'example7'
      field: 'example 7'
- metric: 'example.metric.3'
... 
Run Code Online (Sandbox Code Playgroud)

我将如何实现这一目标?

Ed *_*ton 6

在每个 Unix 机器上的任何 shell 中使用任何 awk:

$ awk '$1=="field:"{s=ORS $0; next} {print $0 s; s=""}' file
- metric: 'example.metric.1'
  attributes:
    - attr: 'example1'
      field: 'example 1'
    - attr: 'example2'
      field: 'example 2'
    - attr: 'example3'
      field: 'example 3'
    - attr: 'example4'
      field: 'example 4'
- metric: 'example.metric.2'
  attributes:
    - attr: 'example5'
      field: 'example 5'
    - attr: 'example6'
      field: 'example 6'
    - attr: 'example7'
      field: 'example 7'
- metric: 'example.metric.3'
Run Code Online (Sandbox Code Playgroud)

如果您field:在某些行之后可能没有空格,或者出于某种原因只是强烈希望使用正则表达式,则更$1=="field:"改为$1~/^field://^[[:space:]]*field:/,无论您喜欢哪个。