ls の結果をls.txtファイルにリダイレクトし、.conf とつく行をgrepで出力する場合、
(1) grep \.conf ls.txt
(2) grep '\.conf' ls.txt
(1) を実行すると、sysconfig などが出力され、 .がエスケープされていないように見えます。
(2)は期待通りに動作します。
grep のマニュアルには、シェルコマンドでは"通常”クォートをつけると記載されているところまでは確認しました。
https://www.gnu.org/software/grep/manual/grep.html
クォートをつけることによってどのような動作が変わるのか網羅的に把握したいです。
こういうものは変わるとかこれを読めとか、ご存じでしたらご教示いただけませんでしょうか。
環境
GNU grep 2.20
Cent OS 7.7.1908
参考までに、GNU grep 3.7 ではどちらでもマッチします。
$ echo sysconfig | grep .conf
sysconfing
$ echo sysconfig | grep '.conf'
sysconfing
なお、-F オプション(fixed string)を付けるとマッチしません。
$ echo sysconfig | grep -F .conf
質問に誤記があり申し訳ありません。
(Teratailのエディタでもエスケープされてしまいました)
.conf は \.conf で確認したかったです。
grep '\.conf' の場合はバックスラッシュが単なる文字として処理されます(続く文字はエスケープされません)。
$ echo 'sysconfig\.conf' | grep '\.conf'
sysconfig\.conf
>クォートをつけることによってどのような動作が変わるのか
クォートはシェルは処理するもので、grepコマンドには渡りません。そのあたりの仕組みが分かってないんじゃないでしょうか。
sigsegvさま
ご助言ありがとうございます。
grep '\.conf' ls.txt
は シェルが\.をそのままgrepに渡すので\.のエスケープが効くが、
grep \.conf ls.txt
は \. の部分を シェルがエスケープ処理してしまうので、grepには .conf が渡っており、エスケープされないということですね!
melianさま
返信が前後してしまいました。
$ echo 'sysconfig' | grep '\.conf'
の場合、grep側で.がエスケープされているので.の文字がないsysconfigが引っかからないようになると思うのですがいかがでしょうか?
echo コマンドにて確認することをおすすめします。
$ echo grep \.conf ls.txt
grep .conf ls.txt
$ echo grep '\.conf' ls.txt
grep \.conf ls.txt
> grep側で.がエスケープされているので.の文字がないsysconfigが引っかからない
そうです。
68userさま
ありがとうございます。
とてもクリアになりました。
回答1件
あなたの回答
tips
プレビュー