というファイルがありますfile.txt
。このファイルには大文字と小文字の単語もあり、大文字と小文字、数字の単語もあります。出力に次の単語が含まれないように、このファイルをフィルタリングしたいと思います。両方大文字と小文字。たとえば、次のように入力しますfile.txt
。
Aaa
aBb
aB
Aa12
12aA
123
123Ab
AAA
aaa
ファイルには大文字と小文字を含む単語(Aaa、aBpなど)があり、その単語には大文字と小文字が含まれています。そして番号(例:123Ab)。また、単語には小文字(例:aaa)または大文字(例:AAA)のみが含まれます。 upperを含む単語だけを削除したいです。そして小文字(Aaa、aBpなど)なので、出力は次のようになります。
Aa12
12aA
123
123Ab
AAA
aaa
どんなアイデアがありますか?
答え1
grep -Exv '[A-Za-z]*([A-Z][a-z]|[a-z][A-Z])[A-Za-z]*'
説明する
- アイデアは、まず、目的と反対の行、つまり大文字と小文字のみを含む行を一致させることです。これは
grep -Ex
、行全体に一致する拡張正規表現でgrepを使用します。その後、この-v
フラグは正規表現を無効にします。つまり、次を返します。欲しくない次の正規表現を一致させます。 - 中央部分は
([A-Z][a-z]|[a-z][A-Z])
大文字と小文字、その逆の文字と一致します。 - 外側の部分は、
[A-Za-z]*...[A-Za-z]*
行の残りの部分に大文字または小文字のみを含める必要があることを意味します。
答え2
1行に1つの単語を想定してくださいgrep
。
grep -E '[[:digit:]]|^([[:lower:]]+|[[:upper:]]+)$'
テキスト内の一致するすべての単語を報告するには、1行に複数の単語を含めることができ、単語は単語ではなく文字で区切られます。
<text tr -cs '[:alnum:][:digit:]_' '[\n*]' |
grep -E '[[:digit:]]|^([[:lower:]]+|[[:upper:]]+)$'
tr
GNUがtr
満足できないPOSIX準拠の実装が必要であることに注意してください。 GNUシステムでは、次のものを使用できますsed
。
<text sed -E 's/\W+/\n/g' |
grep -E '[[:digit:]]|^([[:lower:]]+|[[:upper:]]+)$'
答え3
リクエストを繰り返すには、次のものが必要です。維持する一言で言えば:
- それ
数字手紙ではない - すべて大文字、または
- すべて小文字です
それから
awk '/[^[:alpha:]]/ || /^[[:upper:]]+$/ || /^[[:lower:]]+$/' file
答え4
使用sed
:
$ sed -E -e '/[0-9]/b' -e '/^[A-Z]+$/b' -e '/^[a-z]+$/b' -e 'd' <file
Aa12
12aA
123
123Ab
AAA
aaa
注釈付きsed
スクリプト:
/[0-9]/b # Digits are present, branch to end
/^[A-Z]+$/b # Only uppercase characters present, branch to end
/^[a-z]+$/b # Only lowercase characters present, branch to end
d # Delete line, start next cycle
# (at end, implicit print)
または、
sed -E -e '/[[:digit:]]/b' -e '/^[[:upper:]]+$/b' -e '/^[[:lower:]]+$/b' -e 'd' <file
sed
ロケールによっては、このスクリプトと最初のスクリプトの間に違いがある可能性があります。