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


347

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

私はもう試した:

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

回答:


465

使用する:

grep -- -X

関連:裸の二重ダッシュはどういう意味ですか?nattyについてのnuttyに感謝します)。


57
この段階では何の不思議これらの私たちのために--:手段やないunix.stackexchange.com/questions/11376/...
粋についてのナッツの

2
シルバーサーチャー(ag)でも動作します。
Zev Eisenberg 2013年

:あなたは、変数持つスペースで使用したい場合は、このようなものを使用する必要がありますARGS="-a -b -c" grep -- "$ARGS"
zapstar

2
@zapstarまたは、単にgrep -- "--name awesome"
Brett Widmeier、2015年

@BrettWidmeier、はい、私は変数を使用するべきではありませんでした、それは人々を混乱させます。
zapstar 2015年

57

ダッシュは、http://tldp.org/LDP/abs/html/special-chars.html#DASHREFに記載されているBashの特殊文字です。したがって、これを一度エスケープすると、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"

あなたはアイデアを得ます。


1
私は思いません-ABSガイドが言っていることにもかかわらず、バッシュの特別なキャラクターです。Bashは、次で始まる引数を処理しません-他の引数とは異なります。Bashが後で呼び出すコマンドまたは組み込み関数は、ダッシュで始まる引数を処理しますが、適切と判断します。ほとんどのBashビルトインとLinuxおよびGNUコマンドは、オプションターミネーターとして処理します。「set -x」を使用して、Bashが実行される前に、Bashがエスケープ、グロブ、およびブレースを展開した後に使用するコマンドと引数を確認します。Grepは独自のバックスラッシュエスケープ処理を行うため、紛らわしい例です。
Noah Spurrier、

25

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


1
私のgrepには-eがありません。非常に奇妙です
Mike

14
マイク

2
/ usr / xpg4 / bin / grepからsolarisで入手できます。そのディレクトリには、より完全なユーティリティがたくさんあります。
PRA

MinGWで動作しました(MinGWはサポートしていません-P(ただし、これは別の話であり、ここでは適用されません))。
Peter Mortensen



7

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


5

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

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

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


3

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

'[-]X'


-1
ls -l | grep "^-"

これがあなたの目的に役立つことを願っています。


2
この式は、ダッシュで始まる行のみをキャッチします。最初の質問には適合しません。彼はダッシュで始まる文字列を検索したいのですが、この文字列を含む行の先頭がダッシュである必要はありませんでした。最初の質問では、ダッシュで始まる文字列は行のどこにあってもかまいません。
Laurent Simon

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.