ファイルに.で終わる行があるかどうかを確認する必要があります**
。
*
シェルからワイルドカードとして解釈されるので、どうすればいいかわかりません。
grep -i "^2" test.out
行が2で始まると動作しますが、
grep -i "^**" test.out
明らかに動作しません。
(また、行がaで終わるかどうかを知る必要がありますが、)
まだ試していません。)
答え1
この\
文字を使用して*をエスケープすると、通常の文字になります。
grep '^\*\*' test.out
また、シェルが内容を拡張しないように、二重引用符の'
代わりに単一引用符を使用します。"
答え2
**
で始まり終わる行を確認するには、次のように2つの)
操作を組み合わせることができます。grep
grep '^*\*' test.out | grep ')$'
または、grep
このような単一のコマンドを使用します。
grep -E '^\*\*.*\)$' test.out
説明する
^\*\*
:次から始まるマッチライン**
.*
: 以降のすべての項目と一致**
\)$
)
:ラインの終わりにもあるマッチラインです。
答え3
殻ではありません。
これまでの答えのどれも実際の問題を扱っていませんでした。説明すると役に立ちます。なぜ期待どおりに動作しません。
grep -i "^**" test.out
なぜなら引用パターンgrep、*
ある〜いいえシェルによって拡張されます。grepこれはマニュアルページ[1]に記載されています。強く打つ[2] :
文字を二重引用符で囲むと、$、`、\、および履歴拡張が有効になっている場合!を除いて、引用符内のすべての文字のリテラル値が保持されます。
一般的な正規表現です。
正規表現は模様文字列のセットを説明します。
*
基本的に正規表現の主なパターンの一つです。grep次のように解釈します。
* The preceding item will be matched zero or more times.
これは、現在のパターンが^**
あまり意味がないことを意味します。おそらく行の先頭に一致しようとします。0回以上、二度。
解決策は引用するそれ:
特別な意味を持つメタ文字は、前にバックスラッシュを付けて引用できます。
grep -i "^\*\*" test.out
man dash
[1] 読まないことをお勧めします。
[2] シェルが提供されていないので仮定します。強く打つ。
答え4
完全に引用されていないバージョンは次のとおりですgrep ^\\*\\* test.out
。シェルからgrepにリテラルバックスラッシュを渡すには、エスケープする必要があります。
^\
これは、ディレクトリに別のバックスラッシュで始まり、それを含むファイルがない限り機能します。