パターンにハイフン「-」が含まれている場合にgrepと一致


11

$ aと$ bを一致させるために次のコマンドを記述しましたが、値に「-」が含まれていると、エラーが発生します。どうすればそれを回避できますか?

# a="-Xmx5324m"
# b="-Xmx5324m"
#
#
#  echo "$a"  | grep -Fxc "$b"
grep: conflicting matchers specified

3
grep -Fxc -- "$b" <<< "$a"不要なパイプを回避するようにコマンドを変更することを検討してください
h3rrmiller 2017

8
ところで、本当に正規表現の一致が必要ですか、それとも文字列が別の文字列と等しい(またはその部分文字列である)かどうかをテストするだけですか?その場合は、組み込みのシェル[[ ... ]]またはシェルcaseの方が適していechoます。これは、と子プロセスの特異性の両方を回避するためです。
Uwe 2017

文字列が等しいかどうかこれが私のテストです
yael 2017


別の方法としては、あなたがリストされている誰もを使用しないべきではないこと:それはそれが理解されているので、引用符で囲まれた文字列内のダッシュをエスケープすることが可能ですgrepリテラル文字ではなく、オプションの開始として、すなわちecho test-test | grep "\-test"一致ではなく、未知の文句を言うだろう-tフラグ。
アーロン

回答:


20

--パターンの前に配置します。

echo "$a"  | grep -Fxc -- "$b"

-- 多くのコマンド/シェル組み込みのコマンド終了オプションを指定します。その後、残りの引数は位置引数として扱われます。


13

@sebasthの素晴らしい答えのほかにgrep's -e 、パターンとしてパターンを使用するオプション付きのパターンを指定できます(ここではの<<< zsh代わりにヒア文字列演算子を使用しています。移植性echoについても参照してくださいprintf '%s\n' "$a")。

grep -Fxc -e "$b" <<<"$a"

または他のオプションの横にあるすべて。

grep -Fxce "$b" <<<"$a"

あなたの目標はバイトからバイトへの文字列の等価比較なので、[代わりにコマンドを使用してください。

if [ "$a" = "$b" ]

またはが$a含まれ$bている場合は、[[...]]ksh構文を使用します。

if [[ $a == *"$b"* ]]

または、すべてのBourneのようなシェルでよりポータブルに:

case $a in
  *"$b"*) ...
esac

==[コマンドの標準ではありません。それはバシズムです。=代わりに使用してください。
ワイルドカード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.