正则表达式模式搜索交替字符大小写

正则表达式模式搜索交替字符大小写

我如何通过管道lsgrep交替的字符大小写作为输出?


例如:

我有文件 (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-E正在告诉grep使用正则表达式(regex)进行搜索

  • 在单引号'和括号内()布置了模式。

  • 基本上它读起来匹配任何大写字母[[: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}|^$'

...尽管这只会匹配一行上的单个字符。不过,您可以通过在和最后.?之间执行 a 来解决此问题。^$

答案4

解决办法是

grep -E '^([a-z][A-Z])+$'

相关内容