
私のドキュメント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文字として解釈し、 の出力にすべての大文字の順序が含まれるようにすることです。これにより、興味のある人のために電子行為を行うことができます。scuppertr
xgrep
次のように入力すると、次のようにFOO BAR02 ABCDEF
印刷されます。
FOO
BAR
以前のソリューションではが印刷されますが、DEF
GNUがある場合は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つのセットでのみ機能しますが、あなたの意見によればそれがすべてだと仮定しますか?