**で始まる行を見つける方法

**で始まる行を見つける方法

ファイルに.で終わる行があるかどうかを確認する必要があります**

*シェルからワイルドカードとして解釈されるので、どうすればいいかわかりません。

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にリテラルバックスラッシュを渡すには、エスケープする必要があります。

^\これは、ディレクトリに別のバックスラッシュで始まり、それを含むファイルがない限り機能します。

関連情報