Shell-Script

在文件中的兩個正則表達式模式之間增量交換行

  • June 6, 2021

我正在嘗試使用 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'
...

期望的輸出

- 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'
... 

我將如何實現這一目標?

在每個 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'

如果您可能在某些行之後沒有空格,field:或者出於某種原因只是非常渴望使用正則表達式,請更改$1=="field:"$1~/^field:/or /^[[:space:]]*field:/,無論您喜歡哪個。

引用自:https://unix.stackexchange.com/questions/652822