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
入力ファイルを複数行に分割し、grep
1行ずつ処理します。複数行のパターンを見つけるには、\n
適切な場所に正規表現を使用する必要があります。
これがcreate (\w|\W)*?;
パターンが1行の一致のみを見つける理由です。
さらに、制御記号(およびその1つ)は、\n
「アルファベット」()または「非アルファベット」()グループのメンバーとは見なされません。これらは独自のグループに属しているため、個別に使用する必要があります。\w
\W