ls
交互にgrep
大文字と小文字を出力にパイプするにはどうすればよいですか?
たとえば、
ファイル (1) aAbBaBbA, (2) bAbBaA, (3) bbAb, (4) AAaBbAa, (5) BBBaaa, (6) aBaB.
1,2,6を探したいです。
どのコマンドを入力する必要がありますか?
(編集する):私の例は十分に具体的ではありません。下から上に交互に含めたいです。 (6)から始めなければならないババ到着ババしかし、オリジナルを維持したいと思います。
答え1
努力する
ls -1 | grep -E '^[A-Z]?([a-z][A-Z])*[a-z]?$'
編集:@mikeservが正しく指摘したように、これはASCII以外の文字では機能しません。実際、このような状況は非常に頻繁に発生します(たとえば、ファイル名に外国のタイトルが含まれている音楽ファイル)。したがって、より強力なアプローチは次のとおりです。
ls -1 | grep -E '^[[:upper:]]?([[:lower:]][[:upper:]])*[[:lower:]]?$'
以下では読みやすさのためにそのままにしておきます[A-Z]
。
注:これは単一文字(大文字または小文字)と一致します。 「代替大文字と小文字」は、連続した同様の大文字と小文字がないゼロ個以上の文字シーケンスとして定義されると言えます... :-)
テスト:
mkdir -p /tmp/junk
cd /tmp/junk
touch aAbBaBbA bAbBaA bbAb AAaBbAa BBBaaa aBaB
ls -1 | grep -E '^[A-Z]?([a-z][A-Z])*[a-z]?$'
# aAbBaBbA
# aBaB
# bAbBaA
しかし、これだけでは十分ではありません。追加テスト:
touch aB
touch aBcD
touch aBcDeF
touch aBcDEf
touch Ab
touch AbCd
touch AbCdEf
touch AbCdeF
touch AbCdEF
ls -1 | grep -E '^[A-Z]?([a-z][A-Z])*[a-z]?$'
# aAbBaBbA
# aB
# Ab
# aBaB
# aBcD
# AbCd
# aBcDeF
# AbCdEf
# bAbBaA
答え2
次のコマンドを入力してください。
ls |grep -E '^([[:upper:]][[:lower:]])+[[:upper:]]?$|^([[:lower:]][[:upper:]])+[[:lower:]]?$'
これを分解するには。
ls
主なコマンドですパイプでつながっています
grep
スイッチを使用する
-P
か、正規表現(regex)を使用して検索するように指示してい-E
ます。grep
パターンは一重引用符'と括弧内に()配置されます。
デフォルトでは、大文字
[[:upper:]]
と小文字が一致するように読み取られます。[[:lower:]]
またはパイプの使用|
その後、小さな文字にマッチし、
[[:lower:]]
大文字にマッチします。[[:upper:]]
+
括弧内のすべての項目を一致させ、与えられた()リストで再生します。$
パターンの終わりを教えてくれます。
答え3
set aAbBaBbA bAbBaA bbAb AAaBbAa BBBaaa aBaB
l= u=; printf %s\\n "$@" |
grep -E "^([${l:=[:lower:]}][${u:=[:upper:]}])+[$l]?$|^([$u][$l])+[$u]?$"
出力:
aAbBaBbA
bAbBaA
aBaB
しかし、ピエールの答えを見てください(確かに)これのより良いバージョン。
しかし、他の方法があります。
grep -vE '[^[:alpha:]]|[[:lower:]]{2}|[[:upper:]]{2}|^$'
...しかし、これは1行の単一文字にのみ一致します。ただし、.?
間と端を実行することでこの問題を解決できます。^
$
答え4
解決策は
grep -E '^([a-z][A-Z])+$'