329,
現在、 に正確な文字列が存在するかどうかを確認する bash スクリプトを作成していますmyfile
。 Web を検索していくつかの回答を見つけましたが、-x
よりも多くの数値があるため、パラメータを329,
使用できませんmyfile
。 また、パラメータがないと、 も結果に-x
含まれますが、これは望ましくありません。Exists
329
私は試した;
if grep -xqFe "329," "myfile"; then
echo -e "Exists"
else
echo -e "Not Exists"
fi
出力は次のようになりました。
Not Exists
の中にmyfile
;
329, 2, 57
これをどうすれば解決できますか?
答え1
は-x
ここでは関係ありません。つまり、( からman grep
) 次のようになります。
-x, --line-regexp
Select only those matches that exactly match the whole line.
For a regular expression pattern, this is like parenthesizing
the pattern and then surrounding it with ^ and $.
したがって、これは、探している文字列以外の何も含まれていない行を検索する場合にのみ役立ちます。必要なオプションは次のとおりです-w
。
-w, --word-regexp
Select only those lines containing matches that form whole
words. The test is that the matching substring must either be
at the beginning of the line, or preceded by a non-word
constituent character. Similarly, it must be either at the end
of the line or followed by a non-word constituent character.
Word-constituent characters are letters, digits, and the
underscore. This option has no effect if -x is also specified.
これは、ターゲット文字列がスタンドアロンの「単語」として、または「非単語」文字で囲まれた文字列として見つかった場合に一致します。また、-F
ここでは は必要ありません。これは、パターンに正規表現で特別な意味を持つ文字が含まれており、それを文字通り検索したい場合にのみ役立ちます (例*
)。また、 は-e
まったく必要ありません。これは、複数のパターンを指定したい場合に必要になります。つまり、次のものを探しています。
if grep -wq "329," myfile; then
echo "Exists"
else
echo "Does not exist"
fi
数字が行の最後の数字で、その後に何もない場合にも一致させたい場合には、拡張正規表現を有効にして一致させること,
ができます。grep -E
どちらかa329
の後にコンマ ( 329,
) が続くか、329
行末の a ( 329$
) になります。これらは次のように組み合わせることができます。
if grep -Ewq "329(,|$)" myfile; then
echo "Exists"
else
echo "Does not exist"
fi
答え2
別の選択肢としては、次のものが考えられます。
if cat myfile | tr "," "\n" | grep -xqF "329"; then
echo -e "Exists"
else
echo -e "Not Exists"
fi
よろしく