2 種類の区切り文字/区切り文字で含まれる行の一部を削除します。

2 種類の区切り文字/区切り文字で含まれる行の一部を削除します。

私が作業しているほとんどのコマンドラインツールには、フィールド区切り文字を選択する機能があります。ただし、開始する区切り文字を選択し、処理中の各行から削除するテキストセグメントを終了するには、別の区切り文字を選択したいと思います。

1text [blah blah blah] text number punctuation text text
2text text text
3text text (text) [blah blah blah] number text
4text <url> <email> text [blah blah blah] text

私はこの行から「どうしようもなく」をすべて削除したいと思います。

Blah には、改行、EOF、その他の不連続コンテンツと「[」を除くすべてのコンテンツを含めることができます。つまり、どのデータにも「[[」があってはいけません。 (また「[blah[」)もあってはいけません。

1行に1つの(オプション)[]インスタンスのみがあります。したがって、2行目の場合は削除する内容がなく、一時停止、停止、エラーが発生しないでください。

私は始める「[」があれば「]」もあるとほぼ100%確信しています。それでも確認してみると良いと思います。

別の形式の句読点があるため、削除を開始するために英数字以外のコンテンツを見つけることで使用したくありません(例:4行)。

特定のポイントに2つの(今すぐ隣接する)スペースを一緒に配置しますが、他のポイントから二重スペースを削除しないかどうかを判断できるボーナスポイントです。

awkやsedを使用する必要があると確信していますが、一般的なコマンドラインツールを使用してこれを可能にして移植可能にする方法がある場合は理想的です。

また、現在行っている作業(regex / sedを使用している場合)を説明すると、次の理由で確実に役立ちます。


提案ここ説明する:

sed 's/^.*%\([^ ]*\) .*\$\([^$]*\)$/\1 \2/' infile

私はこの不可能なことを使っていくつかの作業を完了しました。

cat data | sed 's/^.*\[\([^ ]*\) .*\]\([^$]*\)$/\1 \2/'

ただし、「blah blah blah」全体を削除する代わりに、追加の改行文字を残します。


2つの異なる区切り文字でcut / awk / sedを使用する

一般的な意味では、実際に質問に答えません(または少なくとも読んだ後は不明です。おそらく失敗した可能性があります)私のもの部分的に)、しかし(やはり)特にその人のデータに合わせているようです。

ベストアンサー1

これはとても簡単です。これらの区切り文字は必要なく、単純な正規表現を使用するだけです。行の終わりまで、できるだけ[多くの非]OR文字が続く先頭を見つけます。[たとえば、

  1. パール

    [[そうでない場合、または何か奇妙なことが起こっていることを知っている場合:

    perl -pe 's/\[.+?\]//g' file
    

    奇妙なことがある可能性がある場合:

    perl -pe 's/\[[^\[\]]*\]//g' file
    
  2. sed

    sed  's/\[[^]]*\]//g' file
    

おすすめ記事