我在猛砸接下來的兩個正則表達式:檢查如果字符串包含「 - 」和「]」在同一時間
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),那麼它似乎就可以工作。 –