パターンから次の空行まで行を削除する

パターンから次の空行まで行を削除する

パターンから次の空行まで行を削除する必要があります。

たとえば、

pets:
- cat
- dog
- fish

fruits:
- apple
- banana
- orange

colors:
- red
- blue
- pink

「fruit」(モード)から次の空行まですべての行を削除して、次のファイルを作成したいと思います。

pets:
- cat
- dog
- fish

colors:
- red
- blue
- pink

ご回答ありがとうございます。しかし何らかの理由でそれは私には効果がありません。

実際のファイルの例は次のとおりです。

2021  29 23 52  12.2358 -23.40477  -68.53253 142.9283 
L01   2021  29 23 52  32.950 
L01   2021  29 23 52  48.440*
L03   2021  29 23 52  32.730 
L03   2021  29 23 52  48.030 

2021  30  0 44  57.**** -23.****  -68.**** 149.****                                        
L02   2021  30  0 45  19.109
L02   2021  30  0 45  37.419
L04   2021  30  0 45  19.899
L04   2021  30  0 45  38.879

2021  30  1  6  32.7126 -23.45682  -68.65472 100.2616 
L01   2021  30  1  6  48.010
L01   2021  30  1  6  59.480*
L02   2021  30  1  6  47.970
L02   2021  30  1  6  59.380

私は必要です:表ヘッダーに****が付いているデータセットを削除する必要があります。この例では、以下を削除します。

2021  30  0 44  57.**** -23.****  -68.**** 149.****                                        
L02   2021  30  0 45  19.109
L02   2021  30  0 45  37.419
L04   2021  30  0 45  19.899
L04   2021  30  0 45  38.879

このデータを最終ファイルにインポートします。

2021  29 23 52  12.2358 -23.40477  -68.53253 142.9283 
L01   2021  29 23 52  32.950 
L01   2021  29 23 52  48.440*
L03   2021  29 23 52  32.730 
L03   2021  29 23 52  48.030 

2021  30  1  6  32.7126 -23.45682  -68.65472 100.2616 
L01   2021  30  1  6  48.010
L01   2021  30  1  6  59.480*
L02   2021  30  1  6  47.970
L02   2021  30  1  6  59.380

私がしたこと:

sed '/\*\*\*/,/^$/d' filename.data

そして

awk '/\*\*\*/,/^$/{next}1' filename.data

ただし、パターン以降のすべての項目を削除して最初のグループのみを残した後、結果は次のようになります。

2021  29 23 52  12.2358 -23.40477  -68.53253 142.9283 
L01   2021  29 23 52  32.950 
L01   2021  29 23 52  48.440*
L03   2021  29 23 52  32.730 
L03   2021  29 23 52  48.030 

他に何もなく、残りは削除されました。

私の質問が理解されることを願っています。

CSHとBASHについては、彼らがシェルであることを知っています。つまり、私が使用するコマンドがあり、それをCSHで使用できる必要があることを意味します。

事前にありがとう

答え1

cshシェルであり、bashテキスト処理には適していませんが、sedこれらのシェルからテキスト処理ユーティリティを呼び出すことができます。を使用すると、sed次のように2つのパターン間の行範囲を削除できます。

sed '/^fruits:/,/^$/d' yourfile

説明:パターンは^fruits:で始まる行と一致しfruits:、パターンは^$空の行(^行の先頭、$行の終わり)と一致します。これらのパターンを平均で区切ると、次のコマンドが範囲,内のすべての行に適用されます。コマンドはd(削除)です。

答え2

これがYAMLファイルであり、そのセクションを削除する場合は、次のfruitsYAML認識ツールを使用することをお勧めします。yqhttps://kislyuk.github.io/yq/:

$ yq -y 'del(.fruits)' file
pets:
  - cat
  - dog
  - fish
colors:
  - red
  - blue
  - pink

答え3

awk '/^fruits/,/^$/{next}1' infile

デフォルトの印刷されますが、一致するパターンで始まるすべての項目をスキップします。fruits行の先頭から最初の空行まで。

答え4

使用awk:

awk '{arr[NR]=$0}/fruits/,/^$/ { if (/fruits/) line1=NR; if (/^$/) line2=NR}END{for(j=line1;j<=line2;j++) delete arr[j] ; for (i in arr) print arr[i]}' file

 pets:
 - cat
 - dog
 - fish

 colors:
 - red
 - blue
 - pink

arrメインブロックでは、まずレコード番号でインデックス付きの配列を作成します。

次に、この式を使用してif (/fruit/) line1=NR;最初のパターンに一致する行を見つけます。同様に、次の空行を探します。これでarr、これらのレコード間の配列要素と、arrこれらのレコードを含む要素が削除されます。

ENDブロック内では、forループは残りの行を印刷します。

関連情報