我如何通过管道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
或-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])+$'