web-dev-qa-db-ja.com

ダッシュ/ハイフンで始まる文字列をgrepするにはどうすればよいですか?

ファイル内の-Xのようにダッシュ/ハイフンで始まる文字列をgrepしたいのですが、コマンドライン引数としてこれを混乱させています。

私はもう試した:

grep "-X"
grep \-X
grep '-X'
281
Mike

つかいます:

grep -- -X

関連:裸の二重ダッシュはどういう意味ですか?nutty about natty のおかげです)。

382
newacct

http://tldp.org/LDP/abs/html/special-chars.html#DASHREF に記載されているように、ダッシュはBashの特殊文字です。したがって、これを1回エスケープすると、Bashを過ぎてしまいますが、Grepには(オプションを提供することによって)ダッシュするという意味があります。

したがって、あなたは本当にそれを2回エスケープする必要があります(他の言及された答えを使用したくない場合)。以下は動作するはずです

grep \\-X
grep '\-X'
grep "\-X"

Bashが引数をスクリプト/プログラムに渡す方法を試す1つの方法は、すべての引数をエコーする.shスクリプトを作成することです。 echo-args.shと呼ばれるスクリプトを使用して、時々再生します。含まれているものは次のとおりです。

echo $*

私はそれを次のように呼び出します:

bash echo-args.sh \-X
bash echo-args.sh \\-X
bash echo-args.sh "\-X"

あなたはアイデアを得る。

48
Chad Gorshing

grep -e -Xがトリックを行います。

24
Thomas
grep -- -X
grep \\-X
grep '\-X'
grep "\-X"
grep -e -X
grep [-]X
16
John Henry

Solarisマシンにはアクセスできませんが、Linuxではgrep "\-X"が機能します。

7
ezpz

既に説明したように、正しい方法は、「-」を使用して引数の処理を停止することです。これは、ツールのソースでgetopt_long(getopt.hのGNU C関数)を使用しているためです。

これが、他のコマンドラインツールで同じ現象に気付く理由です。それらのほとんどはGNUツールであり、この呼び出しを使用するため、同じ動作を示します。

補足として-getopt_longは、-rloと--really_long_optionの間のクールな選択と、インタープリターの引数の組み合わせを提供します。

5
fmmarques

1つの引数をgrepに渡す別のユーティリティを使用している場合は、次を使用できます。

'[-]X'
3
Colin vH

nawkを使用できます

$ nawk '/-X/{print}' file
2
ghostdog74