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


8

ファイル内の行がで始まるかどうかを確認する必要があります**

*シェルによってワイルドカードとして解釈されるため、その方法を理解できません。

grep -i "^2" test.out

行が2で始まる場合に機能しますが、

grep -i "^**" test.out 

明らかに動作しません。

(この行がaで終わるかどうかも知る必要)がありますが、まだ試みていません)。

回答:


18

\文字を使用して*をエスケープし、通常の文字にします。

grep '^\*\*' test.out

シェルが物事を拡張するのを防ぐために、'二重引用符ではなく一重引用符にも注意してください"


3
*この特定のケースでは、1つ目はエスケープする必要はありません、fwiw。
don_crissti

5
エスケープする必要はありませんが、最初のアスタリスクをエスケープしないと、「行頭にアスタリスクが続く任意の数」に一致するかのように、カジュアルな観察者からさらに混乱を招きます。正規表現をメンテナーにとってより直感的にするものは何でも良い考えです。=)
目立つコンパイラ

1
二重引用符を使用すると、単一引用符だけでなく展開も防止されます。ここで間違ったアドバイス。
rems4e 2016年

@ rems4eで二重引用符を使用すると、シェルはアスタリスクを展開できなくなりますが、バックスラッシュを解釈できなくなります。二重引用符を使用grep "^\\*\\*"する場合、grep ^\*\*がアスタリスクを正規表現の数量詞として解釈しないようにするために必要な文字列を受け取るように使用する必要があります。
アーロン

7

で始まる行**とで終わる行を確認したいので)、次のgrepような2つの操作を組み合わせることができます。

grep '^*\*' test.out | grep ')$'

または、grepこのような単一のコマンドで、

grep -E '^\*\*.*\)$' test.out

説明

  • ^\*\* :で始まるマッチライン **
  • .* :後のすべてに一致 **
  • \)$:行末にあるマッチ行)

3

殻じゃない

これまでの答えのいずれも、実際の問題に触れていません。期待どおりに動作しない理由を説明すると役立ちます。

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を想定しています。


2

その他のオプション。

sedまたは使用することawkもできます

$ sed -n '/^*\*/p' test.out
$ awk '/^*\*/' test.out

ラインを知っているその端部を備えた)使用にもgrepsedawk

$ grep ')$' test.out
$ sed -n '/)$/p' test.out
$ awk '/)$/' test.out

みんな、ありがとう !私はこれの助けに本当に感謝しています!
シャーハンター

1
そして結合されたawk行:'/^*\*/&&/)$/'...
jasonwryan

0

これは完全に引用符で囲まれていないバージョンですgrep ^\\*\\* test.out。シェルからgrepにリテラルバックスラッシュを渡すには、エスケープする必要があります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.