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