我在Bash中有下两个正则表达式:
1.^[-a-zA-Z0-9\,\.\;\:]*$
2.^[]a-zA-Z0-9\,\.\;\:]*$
当字符串包含“ - ”和其他值时,第一个匹配。 第二个包含“]”时。 我把这些值放在我的正则表达式的开头,因为我无法看到它们。 我怎样才能同时匹配这两个值?
答案 0 :(得分:2)
您也可以将-
放在括号表达式的 end ,因为必须在两端关闭范围。
^[]a-zA-Z0-9,.;:-]*$
你也不必逃避任何其他角色。冒号,分号和逗号在正则表达式的任何部分都没有特殊含义,而句点在括号表达式中失去其特殊含义。
答案 1 :(得分:1)
基本上你可以使用它:
grep -E '^.*\-.*\[|\[.*\-.*$'
它匹配-
后跟零个或多个任意字符以及[
或[
后跟零个或多个字符以及-
但是,由于您不接受任意字符,因此需要将其更改为:
grep -E '^[a-zA-Z0-9,.;:]*\-[a-zA-Z0-9,.;:]*\[|\[[a-zA-Z0-9,.;:]*\-[a-zA-Z0-9,.;:]*$'
答案 2 :(得分:0)
也许,这可以帮到你
#!/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-
答案 3 :(得分:0)
您的帖子中有两个问题。
一个在说明中:
我如何能够同时匹配这两个值?
这是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