「class」で始まる不明な行数を含むファイルがあります。 「class」で始まる最初の2行を別のものに置き換え、その2行だけを残し、残りを削除したいと思います。
例:
school
class A
class B
class C
class D
classroom
希望の出力:
school
class X
class Y
classroom
sedを見ていますが、良い解決策が見つかりませんでした。どんなアドバイスもありがとうございました!
ベストアンサー1
使用GNU sed正規表現パターンを拡張して、予約済み-E
スペースをカウンターとして使用できます。
sed -Ee '
/^class(\s|$)/!b
G
/\n{3}/d
/\n{2}/s/.*/class Y/
/\n{1}/s/.*/class X/
p;z;H;d
' file
簡単な説明:
- 使用されたコマンドの編集
sed
:b G z h H d s/// p
- これについてはGNU sedのマニュアルを参照してください。
- アイデアは、単語クラスで始まらないすべての行を印刷し続けることです。
- 今、階級線については一度見たのか、二度見たのか、二回以上見たのか、三つを明確にしなければなりません。
- 私たちは予約されたスペースの内容をパターンスペースにリンクし、改行に細心の注意を払います。
- 改行文字が3つ見つかると=>2回以上発生します。この行をすぐに削除してください。これ以上処理されません。
- 2つの改行が見つかると=> 2番目に表示されますので変更してください。
- 最初の出会いではまた別の変化も生じた。
- 最後の2つのケースのいずれかについては、予約済みスペースを増やしてください。
とともにアッ実用性は簡単です。
awk '
BEGIN {
a[1]="class X"
a[2]="class Y"
}
$1 == "class" {
if ( k++ < 2 ) {
$0 = a[k]
} else { next }
}1
' file
出力:
school
class X
class Y
classroom