0

たとえば、ファイルに正確な文字列が含まれているかどうかを確認する必要がありますが、たとえばそうstring12345ではありませんstring123456。この文字列にはスペースを含めることができます。ファイルは、すべてチェックする必要があるさまざまな行で構成されています。

ただし、文字列は、区切り文字の間など、行の別の場所にある場合があります。区切り文字は または のいずれ|,です。最後に、文字列は行の先頭または末尾に配置することもできます。

これまでに作業した行ごとのチェックは次のとおりです。

sLineFromFile=$(cat "${fFileToCheck}" | grep ^${sStringToCheck},)

したがって、sLineFromFileが空でない場合、ファイル ( fFileToCheck) に が含まれていることがわかりますsStringToCheckが、行の先頭^と、その後にカンマが続く場合のみ,です。

OR次に、次のような機能を探しています。

sLineFromFile=$(cat "${fFileToCheck}" | grep [^,|]${sStringToCheck}[,|$])

これは、このUnix & Linux SE リンクに基づいて機能すると考えていましたが、代わりに文字を文字どおりに受け取っているように見えます (sLineFromFile常に空です)。私は次のような多くのバリエーションを試しました:

sLineFromFile=$(cat "${fFileToCheck}" | grep @[^,|]${sStringToCheck},)
sLineFromFile=$(cat "${fFileToCheck}" | grep (^,|)${sStringToCheck},)
sLineFromFile=$(cat "${fFileToCheck}" | grep '[^,|]${sStringToCheck},')
sLineFromFile=$(cat "${fFileToCheck}" | grep [^,|]${sStringToCheck},)

(ここでは の前に文字をテストするだけですsStringToCheck)。

これをどのように修正すればよいですか?

4

1 に答える 1

1

2 つのオプションが表示されます。

  1. stringToCheckに単語文字 (英数字 + アンダースコア) のみが含まれている場合は、次を使用できます。

     grep -w "$stringToCheck" file
    
  2. それ以外の場合は、次を使用します。

     grep -E "(^|[\|,])$stringToCheck([\|,]|$)" file
    

これで問題は解決すると思います。

ここでも、一致した行全体を取得する代わりに、次のようなものを使用して同じことを実現できます。

c=$(grep -Ec "(^|[\|,])$stringToCheck([\|,]|$)" file)
if [ $c -eq 0 ]
then
echo noMatch
else
echo hasMatch
fi
于 2013-08-28T12:39:07.417 に答える