回答:
\
文字を使用して*をエスケープし、通常の文字にします。
grep '^\*\*' test.out
シェルが物事を拡張するのを防ぐために、'
二重引用符ではなく一重引用符にも注意してください"
grep "^\\*\\*"
する場合、grep ^\*\*
がアスタリスクを正規表現の数量詞として解釈しないようにするために必要な文字列を受け取るように使用する必要があります。
これまでの答えのいずれも、実際の問題に触れていません。期待どおりに動作しない理由を説明すると役立ちます。
grep -i "^**" test.out
あなたがしているので引用さにパターンをgrepを、*
されていないシェルによって拡大しました。そのままgrepに渡されます。これはbash [2]のマニュアルページ[1]で説明されています:
文字を二重引用符で囲むと、$、 `、\、および履歴拡張が有効な場合は!を除いて、引用符内のすべての文字のリテラル値が保持されます。
正規表現は、一連の文字列を記述するパターンです。
*
正規表現の重要なパターンの1つです。デフォルトでは、grepはそれを次のように解釈します。
* The preceding item will be matched zero or more times.
つまり、現状のパターン^**
はあまり意味がありません。おそらく、行の先頭に0回以上、2 回一致しようとします。それがどのような意味でも。
解決策はそれを引用することです:
特別な意味を持つメタ文字は、その前にバックスラッシュを付けることで引用できます。
grep -i "^\*\*" test.out
[1]読むことはお勧めしません。man dash
代わりになどを使用してください。
[2]シェルが与えられなかったので、私はbashを想定しています。
その他のオプション。
sed
または使用することawk
もできます
$ sed -n '/^*\*/p' test.out
$ awk '/^*\*/' test.out
ラインを知っているその端部を備えた)
使用にもgrep
かsed
かawk
$ grep ')$' test.out
$ sed -n '/)$/p' test.out
$ awk '/)$/' test.out
'/^*\*/&&/)$/'
...
*
この特定のケースでは、1つ目はエスケープする必要はありません、fwiw。