ファイルの2つの正規表現パターン間で行を徐々に交換します。

ファイルの2つの正規表現パターン間で行を徐々に交換します。

Bashスクリプトを使用してファイルに対していくつかのテキスト処理を実行しようとしています。目的は、「attribute:」タグの下にインデントされた「field:」で始まるすべての行を「-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'
... 

どうやってこれを達成できますか?

ベストアンサー1

すべてのUnixシステムのすべてのシェルで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:/してください。/^[[:space:]]*field:/

おすすめ記事