awkを使用してファイルから行ブロックを削除する

awkを使用してファイルから行ブロックを削除する

次のファイルがあります。

---
some metadata
...
---
Some real content.
...
Important content.

予想出力:

Some real content.
...
Important content.

単純化のために、/^---$/ヘッダーメタデータブロックの開いている区切り文字と閉じた区切り文字を除く他の場所では厳密な行が発生しないとします。図1に示すように。

---注:閉じる区切り記号とコンテンツの最初の行の間に複数の新しい行を配置できます。この場合、新しい行が維持されるかどうかは関係ありません。

awk後で必要なときにファイルでより多くの作業を実行するのに役立つほど、汎用性が高く強力だと思うので、このコマンドを使用するのが最善だと思いました。

に基づいてこれは別の同様の質問に対する答えです、私は成功せずに次のことを試しました。

awk '/---/ {s=1} /---/ && s==1 {s=0} !s' $file

2番目のルールが実際にファイルの最初の行と再一致するためですか?

これを効率的に行う他の方法はありますかawk

答え1

どうですか?

awk 'BEGIN { metadata = 0 } /---/ { metadata = !metadata; next } !metadata' FILE

次の入力を使用してくださいFILE(行を追加しました)。

---
some metadata
...
---
Some real content.
...
Important content.
---
some metadata
...
---
1
2
3

次のように印刷されます。

Some real content.
...
Important content.
1
2
3

あなたのスクリプト:

awk '/---/ {s=1} /---/ && s==1 {s=0} !s' $file

s最初に1に設定したので機能しません。

/---/ {s=1}

あなたまもなく0に設定します。

/---/ && s==1 {s=0}

!sそしてIOWの場合はレコードを印刷するので、!01日の終わりに各行を印刷します。

答え2

GNU sed拡張正規表現を使用して、ダッシュ - ダッシュからダッシュ - ダッシュに削除を読み込みます。

sed -Ee '
  /^-+$/,/^-+$/d
' file

答え3

awk '/^---$/ && s++<2{ next } s>1 && NF' infile

答え4

sed '/metadata/,+2d' filename| sed '/---/d'

入力する

---
some metadata
...
---
Some real content.
...
Important content.
---
some metadata
...
---
1
2
3

出力

Some real content.
...
Important content.
1
2
3

関連情報