sedコマンドは私が望むものを返しません

sedコマンドは私が望むものを返しません

私のドキュメントdoc.lstは、次の数字と文字で構成されています。 01 ABC、「ABC」部分のみ使用します。これを試しましたが、私のresult.lstの数が含まれています。

    sed -n -e '/[A-Z][A-Z][A-Z]/p' < doc.lst > result.lst

この番号をどのように削除しますか?

答え1

sed -n -e '/[A-Z][A-Z][A-Z]/p'

この正規表現に一致する行を印刷します。

希望する場所は次のとおりです。

sed -n 's/.*\([[:upper:]]\{3\}\).*/\1/p'

\1つまり、任意の文字シーケンス(できるだけ多く)、3つの大文字(キャプチャを含む)、その後にキャプチャされた文字で構成された任意の文字シーケンスを置き換え、一致する場合に\(...\)印刷します。その代替結果(pコマンドのフラグ)s

1行に1セット(最も右側のセット)のみが印刷されます。

すべて印刷するには:

tr -cs '[:upper:]' '[\n*]' | grep -Ex '.{3}'

(一部のtr実装ではマルチバイト文字を正しく処理できません。)

アイデアは、大文字と小文字の相補的な順序を改行tr文字として解釈し、 の出力にすべての大文字の順序が含まれるようにすることです。これにより、興味のある人のために電子行為を行うことができます。scuppertrxgrep

次のように入力すると、次のようにFOO BAR02 ABCDEF印刷されます。

FOO
BAR

以前のソリューションではが印刷されますが、DEFGNUがある場合はgrepそのオプションを使用できます-o

grep -Eo '[[:upper:]]{3}'

これにより、次のものが印刷されます。

FOO
BAR
ABC
DEF

答え2

このようなリストの場合...

01ABC
03BHG
2TG

...あなたができることがたくさんあります。

おそらく最も簡単な方法は、次のようにできることです。

sed 's/[^[:upper:]]\{1,\}/\n/g;/^\n/D'

...これは、単にewlineを大文字以外の文字シーケンスに置き換えて、ewlineで始まる後続の結果を\n印刷しないようにします。\n(ただし、大文字を保持しても印刷はされます)

大文字の後に数字を保持するには、以下を試してください。

sed -n '/[[:upper:]]/s/[^[:upper:]]*//p'

...これにより、大文字が確実に含まれる行の先頭から大文字以外のすべての文字が削除され、結果が印刷されます。これは行ごとに1つのセットでのみ機能しますが、あなたの意見によればそれがすべてだと仮定しますか?

関連情報