2016-07-15 4 views
0

で私はbashで次の二つの正規表現を持っています。 2番目には "]"が含まれます。 私は正規表現の始めにこの値を入れます。なぜなら、私はそれを形にすることができないからです。 どのようにして2つの値を同時に一致させることができますか?チェック「」と「]」同時に

+0

私のgrepの場合、閉じた角括弧 '... \: - ]'の前に '-'を置くとうまくいくように見えます。 –

答えて

2

を助けることができる範囲は、両端で閉じられなければならないので、あなたはまた、ブラケット表現の最後-を配置することができます。

^[]a-zA-Z0-9,.;:-]*$ 

他の文字もエスケープする必要はありません。コロン、セミコロン、およびコンマは、正規表現のどの部分にも特別な意味を持ちませんが、期間はブラケット式の中で特別な意味を失います。

+0

これは、どちらかを含んでいない 'aaaa' ']'や '-' – hek2mgl

+2

元の正規表現はどちらもそうです。同じブラケット式の中に ']'と '--'を両方含む方法に答えるだけです。 – chepner

+0

今、それについての質問は明らかです。それを読んで! :) – hek2mgl

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- 
1

基本的にはこれを使用することができます:

grep -E '^.*\-.*\[|\[.*\-.*$' 

それが一致するゼロまたはそれ以上の任意の文字が続く-[またはゼロ個以上の文字が続く[とただし-

以来任意の文字を受け入れない場合は、次のように変更する必要があります。

grep -E '^[a-zA-Z0-9,.;:]*\-[a-zA-Z0-9,.;:]*\[|\[[a-zA-Z0-9,.;:]*\-[a-zA-Z0-9,.;:]*$' 
0

あなたの投稿の質問。

  1. 一つは説明である:

    私は、同時に2つの値を一致させる取得できますか?

    pattern='^[]a-zA-Z0-9,.;:-]*$' 
    

    1つ(または複数の)- ... OR ... ]が含まれているいずれかの行にマッチします:あなたの二つの範囲を混ぜ、その範囲で行うことができるORマッチが、ある

    ... OR含まれている文字のいずれか。以下のテストスクリプトでは、これはすべての行(?????++++++as df ghを除く)です。タイトルにある

  2. 2:

    ...文字列が含まれています「 - 」と「]」を同時に

    AND一致します。それを行うための最も簡単な(最も遅い)方法がある:

    echo "$line" | grep '-' | grep ']' | grep '^[-a-zA-Z0-9,.;:]*$' 
    

    選択のみ行をgrepした最初の二つの呼び出し:

    -と、(1または複数の(1または複数)の両方が含まれているが)]

テストスクリプト:

#!/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 
関連する問題