我在猛砸接下来的两个正则表达式:检查如果字符串包含“ - ”和“]”在同一时间
1.^[-a-zA-Z0-9\,\.\;\:]*$
2.^[]a-zA-Z0-9\,\.\;\:]*$
的第一场比赛时,字符串中包含一个“ - ”和其他值。 第二个包含“]”时。 我把这个值放在我的正则表达式的开始处,因为我无法对它们进行评估。 我如何能同时匹配两个值?
我在猛砸接下来的两个正则表达式:检查如果字符串包含“ - ”和“]”在同一时间
1.^[-a-zA-Z0-9\,\.\;\:]*$
2.^[]a-zA-Z0-9\,\.\;\:]*$
的第一场比赛时,字符串中包含一个“ - ”和其他值。 第二个包含“]”时。 我把这个值放在我的正则表达式的开始处,因为我无法对它们进行评估。 我如何能同时匹配两个值?
也许,这可以帮助你
#!/bin/bash
while read p; do
echo $p | grep -E '\-.*\]|\].*\-' | grep "^[]a-zA-Z0-9,.;:-]*$"
done <$1
user-host:/tmp$ cat test
-i]string
]adfadfa-
string-
]string
str]ing
]123string
123string-
?????
++++++
user-host:/tmp$ ./test.sh test
-i]string
]adfadfa-
基本上你可以使用这个:
grep -E '^.*\-.*\[|\[.*\-.*$'
它匹配任何一个-
后跟零个或多个任意字符和[
或[
后跟零个或多个字符和-
然而,由于您不接受任意字符,您需要将其更改为:
grep -E '^[a-zA-Z0-9,.;:]*\-[a-zA-Z0-9,.;:]*\[|\[[a-zA-Z0-9,.;:]*\-[a-zA-Z0-9,.;:]*$'
有两个您的帖子中有问题。
一个是在说明:
我怎么能这两个值同时获得匹配吗?
这是一个OR
比赛,它是用范围内进行的是混合的两个范围:
pattern='^[]a-zA-Z0-9,.;:-]*$'
这将匹配任何包含一个(或几个)-
... OR
... ]
线... OR
任何包含的字符。这将是以下测试脚本中的所有行(除?????
,++++++
和as df gh
)。
二是在标题:
...字符串包含“ - ”和“]”在同一时间
这是一个AND
比赛。做到这一点最简单的(和最慢)的方法是:
echo "$line" | grep '-' | grep ']' | grep '^[-a-zA-Z0-9,.;:]*$'
前两个电话给grep选择只该行:
同时包含(一个或多个)-
和(一个或几个)]
测试脚本:
#!/bin/bash
printlines(){
cat <<-\_test_lines_
asdfgh
asdfgh-
asdfgh]
as]df
as,df
as.df
as;df
as:df
as-df
as]]]df
as---df
asAS]]]DFdf
as123--456DF
as,.;:-df
as-dfg]h
as]dfg-h
a]s]d]f]g]h
a]s]d]f]g]h-
s-t-r-i-n-g]
as]df-gh
123]asdefgh
123asd-fgh-
?????
++++++
as df gh
_test_lines_
}
pattern='^[]a-zA-Z0-9,.;:-]*$'
printf '%s\n' "Testing the simple pattern of $pattern"
while read line; do
resultgrep="$( echo "$line" | grep "$pattern" )"
printf '%13s %-13s\n' "$line" "$resultgrep"
done < <(printlines)
echo "#############################################################"
echo
p1='-'; p2=']'; p3='^[]a-zA-Z0-9,.;:-]*$'
printf '%s\n' "Testing a 'grep AND' of '$p1', '$p2' and '$p3'."
while read line; do
resultgrep="$( echo "$line" | grep "$p1" | grep "$p2" | grep "$p3" )"
[[ $resultgrep ]] && printf '%13s %-13s\n' "$line" "$resultgrep"
done < <(printlines)
echo "#############################################################"
echo
printf '%s\n' "Testing an 'AWK AND' of '$p1', '$p2' and '$p3'."
while read line; do
resultawk="$( echo "$line" |
awk -v p1="$p1" -v p2="$p2" -v p3="$p3" '$0~p1 && $0~p2 && $0~p3')"
[[ $resultawk ]] && printf '%13s %-13s\n' "$line" "$resultawk"
done < <(printlines)
echo "#############################################################"
echo
printf '%s\n' "Testing a 'bash AND' of '$p1', '$p2' and '$p3'."
while read line; do
rgrep="$( echo "$line" | grep "$p1" | grep "$p2" | grep "$p3" )"
[[ ($line =~ $p1) && ($line =~ $p2) && ($line =~ $p3) ]]
rbash=${BASH_REMATCH[0]}
[[ $rbash ]] && printf '%13s %-13s %-13s\n' "$line" "$rgrep" "$rbash"
done < <(printlines)
echo "#############################################################"
echo
对于我的grep,如果你在右方括号'... \: - ]之前加上'-''(这是2),那么它似乎就可以工作。 –