パターンから次の空行まで行を削除する必要があります。
たとえば、
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ファイルであり、そのセクションを削除する場合は、次のfruits
YAML認識ツールを使用することをお勧めします。yq
https://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ループは残りの行を印刷します。