このgrepに '\ n'を書く必要がありますか?

このgrepに '\ n'を書く必要がありますか?

createで始まり、終わる行を検索しようとしています;。一致は複数行にまたがることができます。使ってみましたgrepこのためにインターネット検索を行った後、方法を見つけました。

次のクエリでこれを実行できます。

grep -zioE 'create (\w|\W|\n)*?;' Day1.sql  | less


# Output
create schema sigmoid_db;
create table instructor(
ID char(5),
name varchar(20),
dept_name varchar(20),
salary numeric(8,2));

\nなぜ同じクエリが機能しないのかを尋ねたいです。以下のクエリは同じ出力を生成する必要があります。

grep -zioE 'create (\w|\W)*?;' Day1.sql  | less

# Output
create schema sigmoid_db;

私の推論は、\w|\Wどの文字とも一致しなければならないということです。ただし、2番目のコマンドは複数行にまたがるパターンを印刷しません。

なぜこれが起こるのか教えてくれる人がいますか?

ベストアンサー1

この\n記号はキャリッジリターン文字です。これは、ある線を別の線から区切る特殊記号です。

すべてのテキストファイルは実際には長いリストです。たとえば、次のようになります。

first\nsecond\nthird\n

画面に次のように印刷

first
second
third

入力ファイルを複数行に分割し、grep1行ずつ処理します。複数行のパターンを見つけるには、\n適切な場所に正規表現を使用する必要があります。

これがcreate (\w|\W)*?;パターンが1行の一致のみを見つける理由です。

さらに、制御記号(およびその1つ)は、\n「アルファベット」()または「非アルファベット」()グループのメンバーとは見なされません。これらは独自のグループに属しているため、個別に使用する必要があります。\w\W

おすすめ記事