grepを使用して!#abcを含むファイルを検索する

grepを使用して!#abcを含むファイルを検索する

次の内容を含むファイルを表示しようとしています。

!#abc

私はこうしてみました

grep -l '!#abc'

しかし、うまくいきません。なぜ?

また、私が次のようなことをしようとすると

echo "#!a"

検索する

echo "#alias".

誰かがここで何が起こっているのか説明できますか? #!どういう意味ですか?実際に代表?

答え1

あなたは書く必要があります

grep \\!\\#abc <file>

#デフォルトでは、およびをエスケープする必要があります!。これら2つの文字は、ほぼすべてのシェルで特別な意味を持ちます。これについて詳しくは、シェルのドキュメントを読んでください。

答え2

まあ、grep:grep -l '!#abc'処理するファイルのリストも必要です。

grep -l '!#abc' ./*

現在のディレクトリ内のすべてのファイルに適用されます。

echo:echo "#!a"引用がもう少し必要です。たとえば、次のようになります。

$ echo '#!a'
#!a

$ echo '#'\!'a'
#!a

$ echo '#'\!a
#!a

$ echo "#!"a
#!a

$ echo "#"'!a'
#!a

$ echo $'#!a'
#!a

「#」はコメント文字です。からLESS=+'/^ *COMMENTS' man bash

コメント

In a non-interactive shell, or an interactive shell in which the  
interactive_comments option to the shopt builtin is enabled (see SHELL  
BUILTIN COMMANDS below), a word beginning with # causes that word and  
all remaining characters on that line to be  ignored. An interactive  
shell without the interactive_comments option enabled does not allow  
comments. The interactive_comments option is on by default in  
interactive shells.

それ以降の内容は「コメント」とみなされ、処理されません。例:

$ echo one # two three
one

その効果を避けるには、それを引用するか、スペース以外の文字の後に置く必要があります。

$ echo one t# wo three
one t# wo three

彼は!歴史上「核心人物」だ。
氷山の一角:ソースLESS=+'/^ *HISTORY EXPANSION' man bash

歴史拡張
歴史拡張は歴史拡張キャラクターの登場を通じて紹介されます!基本的に。バックスラッシュ()と一重引用符のみが歴史的拡張文字を引用できますが、歴史的拡張文字も二重引用符で囲まれた文字列で閉じる二重引用符の直前にある場合は、引用符として扱われます。


最後の質問は次のとおりですWhat does #! in fact represent?

答えはIt depends. 周辺のキャラクターによっても変わるということです。
引用の有無(および方法)によって異なります。先行スペースおよび/または末尾スペースがあるかどうかによって異なります。

正しく引用すると同じ文字になります。先行スペースなしで引用する場合:コメント。引用しない場合は、先行スペースもなく、後続スペースもありません。つまり、歴史的な拡張です。
引用符がない場合、先行スペースと末尾スペースはありません。

もちろんこれは仮想の選択です。

shopt -p interactive_comments
shopt -po history

どちらも決まった。それぞれは、対話型シェル内の対応する文字(and)を制御します#!非対話型シェルでは、コメント文字は常に適用され、履歴拡張はほとんど常に有効になりません。

関連情報