シフト文字の正規表現パターンの検索

シフト文字の正規表現パターンの検索

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])+$'

関連情報