gpt4 book ai didi

bash - Shell 元字符 - 匹配这些类型文件名的更短方法?

转载 作者:行者123 更新时间:2023-12-04 06:34:27 31 4
gpt4 key购买 nike

在练习中,我编写了一个由最多匹配 3 个大写字符的元字符组成的表达式。

例子

a -> match
A -> match
Ab -> match
AbC -> match
AbCd -> match
...
ABCD -> no match, 4 uppercase chars

这是我想出来的,但我觉得我可以把它缩短
ls @(!(*[A-Z]*)|*[A-Z]*|*[A-Z]*[A-Z]*|*[A-Z]*[A-Z]*[A-Z]*)

编辑

Sry 的困惑。首先,我只被允许使用元字符,不能使用正则表达式,不能测试,不能使用像 awk/sed/别的工具。
此外,大写字母不能连续。

编辑

好的,这个似乎有效(但更长!)。
export LC_COLLATE=C

ls @(!(*[A-Z]*)|!(*[A-Z]*)[A-Z]!(*[A-Z]*)|[A-Z]!(*[A-Z]*)[A-Z]!(*[A-Z]*)|!(*[A-Z]*)[A-Z]!(*[A-Z]*)[A-Z]!(*[A-Z]*)[A-Z]!(*[A-Z]*)

最佳答案

你的模式对我不起作用。一个问题是,在许多非 C 语言环境中 [A-Z]包括一些小写字符。

$ for c in a A b B z Z; do if [[ $c = [A-Z] ]]; then echo "match: $c"; else echo "no match: $c"; fi; done
no match: a
match: A
match: b
match: B
match: z
match: Z

LANG=C 再试一次.如果您只想匹配大写字符而不管区域设置,请使用 [[:upper:]] .

你的不起作用的另一个原因是它的一部分总是匹配。

例如:
!(*[A-Z]*)

(即使使用 [[:upper:]] 更正)匹配(拒绝)任何只包含大写字符的内容,而不管长度如何。但是,(部分更正)模式的其余部分显式包含大写字符,同时由于星号而隐式包含任何包含大写字符的字符。所以只是第一部分:
*[[:upper:]]*

说包括所有由至少一个大写字符组成的字符串,而不考虑可能还有多少:一、十、一百万。

相反,试试这个:
if [[ $string != *[[:upper:]]*[[:upper:]]*[[:upper:]]*[[:upper:]]* ]]
then
echo "match: fewer than four uppercase character"
fi

它只是检查是否有四个或更多大写字符。

您还可以使用正则表达式(在 Bash 3.2 或更高版本中):
if [[ ! $string =~ ^.*[[:upper:]].*[[:upper:]].*[[:upper:]].*[[:upper:]].*$ ]]
then
echo "match: fewer than four uppercase character"
fi

另一种方法是删除所有非大写字符并比较长度差异。

演示:
#!/bin/bash
strings[1]='AbCdEfghi'
strings[2]='ABCD'
strings[3]='Ab1Cd2Ef3ghi'
strings[4]='A1BbC2Dd'

for string in "${strings[@]}"
do
test=${string//[^[:upper:]]}
if (( ${#test} > 3 ))
then
echo "no match: $string"
else
echo "match: $string"
fi
done

关于bash - Shell 元字符 - 匹配这些类型文件名的更短方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4998223/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com