次の行の内容に基づいて特定のテキストを削除する

次の行の内容に基づいて特定のテキストを削除する

次の行の内容に基づいて特定のテキストを削除するコマンドが必要です。特に、次の行が「]」の場合は、「カンマ」を削除し、次の行の「]」も削除したいと思います。

はい

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

おすすめ記事