2

誰かが私を正しい方向に向けることができるかどうか疑問に思っています。ファイルで2つの文字列を検索したいのですが、一致する場合はcsvファイルにYESを追加し、一致しない場合はNOを追加します。今のところ難しいのは、文字列を見つけて、以下のように見つかった場合は画面にSUCCESSを印刷することです(ファイルへの書き込みを自分で行ってみて、学習します)。

両方の文字列が一致する必要があります。一致しない場合、結果は「いいえ」になります。

私はこれまでにこれを手に入れました:

#/usr/bin/bash
file=test.xml
string1=TEST1
string2=TEST2
if grep -e "$string1|$string2" "$file"
then
    echo IT WORKS!!!
else
    echo UH OH!!!
fi
4

4 に答える 4

1

を使用grepすると、ファイルを2回読み取る必要があります。

if grep "$string1" "$file" && grep "$string2" "$file"

ただし、AWKを使用すると、フラグを設定でき、ファイルを読み取る必要があるのは1回だけです。

awk -v s1="$string1" -v s2="$string2" '$0 ~ s1 {f1 = 1} $0 ~ s2 {f2 = 1} END {if (f1 && f2) {print "Yes"} else {print "No"}}' "$file"
于 2012-07-09T17:18:37.830 に答える
0

どちらかの文字列照合で十分であると想定して、次のことを試してください。

file=test.xml
string1="TEST1"
string2="TEST2"

if grep -q -F "$string1"$'\n'"$string2" "$file" ; then
    printf YES
else
    printf NO
fi

重要なのは-F、文字列に正規表現の特殊文字が含まれている場合、それらは文字通りに扱われることを意味します。便宜上-q、の出力は抑制されるgrepため、YES/NOのみが返されます。

編集:

両方の文字列を一致させる必要があるため、次のことを試してください。

if [ $(sed -n -e "/${string1}/p;/${string2}/p" "$file" | wc -l) -ge 2 ] ; then
    printf YES
else
    printf NO
fi

文字列内の正規表現文字は文字通りに扱われず、かなり非効率的であるため、これはバージョンほど安全ではありませgrepんが、作業は完了します。

于 2012-07-09T16:07:59.200 に答える
0

あなたのコードは良い方向にあります。使用している正規表現を認識するために、を変更-eする必要があります( )。また、実際の一致が表示されないようにすることもできます(そのためにクワイエットフラグを使用します)。-Egrep$string1|$string2-q

file=test.xml
string1="TEST1"
string2="TEST2"
if grep -E -q "$string1|$string2" "$file"
then
    echo IT WORKS!!!
else
    echo UH OH!!!
fi

編集:両方の文字列を一致させる必要があるため、 ( @ chepnerの回答のように)複数回grep実行しない限り、(AFAIK)ではこれは不可能です。grep

別の解決策は、以下を使用することawkです。

awk '/'$string1'/{s1=1}/'$string2'/{s2=1} END { \
    if (s1 && s2) print "IT WORKS!!!" ; else print "UH OH!!!" }' "$file"
于 2012-07-09T16:02:20.230 に答える
0

両方の文字列を一致させたいので、非効率的な方法は、grepパターンごとに1回呼び出すことです。

if grep -q "$string1" && grep -q "$string2"
then
echo IT WORKS
else
echo UH OH
fi

かなり複雑な正規表現を使用せずに、1回のgrep呼び出しでこれを行う方法を私は知りません。何かのようなもの

grep -qE "$string1.*$string2|$string2.*$string1"

string1動作する可能性がありますが、との値に応じて、誤検知や誤検知が含まれると確信していますstring2

于 2012-07-09T16:04:13.100 に答える