15

これは私のサンプルテキストファイルです:

アズダ
// <<< TAG
これは削除する必要があります
// TAG >>>
これはそこにあるはずです
// <<< TAG
T
>>
asd
asd
// TAG >>>

私はo/pを次のようにしたいと思います:

アズダ

これはそこにあるはずです

基本的に、「// << >>」の間の行(これらの行も含む)を見つけて削除しようとしています。

sedを使ってみました

sed -n '1h; 1!H; $ {; g; s /// <<] * TAG >>> // g; p;}' <test.txt

しかし、それが正しい出力を生成しなかった方法がいくつかあります。">"記号を含む2番目のタグが正規表現で失敗しました。どこが間違っているのかわからない?

それを行う方法はありますか?

4

3 に答える 3

11

文字通りのテキスト「TAG」を含む行を削除しようとしている場合は、次のことを試してください。

sed'/ \ / \ / <<< TAG /、/ \ / \ / TAG >>> / d'

あなたのコメントから、TAGはリテラルではないようです。その場合:

sed'/^\/\/<</,/^\/\/.*>>/d'

これは、別の区切り文字を使用して簡略化できます。

sed '@^//<<<@,@^//.*>>>@d'
于 2009-08-03T11:07:04.447 に答える
3

私が提供したsedソリューションを使用するのではなく、perlとawkでこれらのいずれかを使用することをお勧めします。

perl -ne'print if!(m @ // <<< TAG @ .. m @ // TAG >>> @)'
awk'/ \ / \ / <<< TAG /、/ \ / \ / TAG >>> / {next} 1'

TAGを定数にしたくないと思うので、私が知っている最もクリーンなソリューションはperlバリアントです。

perl -ne'print if!(m @ ^ // <<<(。*)@ .. m @ ^ // $ 1 >>> $ @)'
于 2009-08-03T16:05:01.623 に答える
1

さらに、の検索区切り文字はsed、最初の区切り文字をエスケープすることで変更できます。

sed '\|^//<<<|,\|^//.*>>>|d' file

Awkバージョンは、同じタグ名の末尾に一致します。

awk -F'//<<<|//|>>>' '$2{p=$2; while(getline && p!=$2); next}1' file
于 2013-03-08T15:43:24.633 に答える