次の行の内容に基づいて特定のテキストを削除するコマンドが必要です。特に、次の行が「]」の場合は、「カンマ」を削除し、次の行の「]」も削除したいと思います。
はい
987678680,
]
123435434-
]
2345643,
]
2345632-
]
234563,
]
1234567654,
]
出力
987678680
123435434-
]
2345643
2345632-
]
234563
1234567654
ベストアンサー1
この種の操作(連続する行が特定のパターンと一致する場合は編集/実行)を処理する最も簡単な方法は、おそらくsed
次のとおりです。N;P;D
サイクルまた〜として知られています「スライドウィンドウ」:
sed -e '$!N;s/,\nPATTERN//;t' -e 'P;D' file
これにより、N
追加の行がパターンスペースに配置され、s
必要に応じて無条件に置き換えようとします。次に、t
交換が成功したことを確認します。その場合は、スクリプトの終わり(ラベルなし)に分岐して、自動的にパターンスペースを印刷します。それ以外の場合は、パターン空間の最初の行をP
印刷してD
削除し、ループを再開します。
その他牛に似た一種の栄養 sed
方法:
sed ':x /,$/{N;s/,\n]//;T x}' file
この方法は、末尾のコンマが偶数行にある場合にも機能します。例:
printf '%s\n' 1, 2, ']' | sed ':x /,$/{N;s/,\n]//;T x}'
出力:
1,
2
仕組み:
ほとんどのプログラミング言語では、アドレスタグは完全に受動的です。タグはコードを表示しますが、そのコードの動作を変更しません。 いいえ sed
しかし。プログラムの先頭のラベルにジャンプすると、sed
実際にコードの動作が変化したり、暗黙的なエラーを回避したりできます。n
外線sed
ループが通常始まるコードです。
これT
失敗した場合は、estと分岐に進みます。コマンドはT x
以前かどうかを確認しますs
代替このコマンドは何もしません。その場合は、:x
スタートラベルにジャンプします。いいえ何でも印刷するか、新しい行を読んでください。これは次のことを意味します。N
延長線を追加交換されていない項目は必要に応じて再検索されます。
雨牛に似た一種の栄養 sed
、(T
コマンドが利用できず、構文が緩和されていない場合)、移植性が高くなければなりません。
sed ':x
/,$/{
N
s/,\n]//
t
b x
}' file