なぜ `awk'/^[^\t]/{a++}END{print a}'' は空行を計算しないのですか?

なぜ `awk'/^[^\t]/{a++}END{print a}'' は空行を計算しないのですか?

awk '/^[^\t]/{a++}END{print a}'空行(つまり改行文字のみを含む行)はなぜ計算されませんか?空白行は\tタブで始まりませんか?

答え1

その理由は[^\t]キャラクターが必要だからだ。改行文字($)は文字とは見なされません。以下が必要です。

awk '/^([^\t]|$)/{a++}END{print a}'

答え2

X以外のものを見つけることは、Xを含まない行を見つけることとは異なります。

タブ文字で始まる行を見つけるには、regexを使用できます/^\t/。反対の行、つまりタブで始まらない行を見つけるための最も簡単な方法は、おそらく全体のパターンの周りに否定を置くことです(文字クラスに入れる代わりに)。

awk '!/^\t/ {a++} END {print a+0}' 

a+0これにより、ゼロの数の結果は空ではなくゼロになります。

一方、正規表現には次のものが[^\t]必要です。一部文字の場合、タブ文字は使用できません。

空行を一致させるには、/^$/または$0 == ""。または、空白行または空白のみを含む行を一致させます/^[[:space:]]*$/

答え3

正規表現では[^\t]「何も一致しません」という意味ではありません\t。 「を除くすべての文字と一致」を意味します\t。主な違いは、一致する文字が1つなければならないことです。空行の場合は空行はありません。

答え4

一致式 /^[^\t]/ に「タブで始まらない行」と書かれていることを読みました。本当に空の行を探している場合は、次のようにします。

awk '/^$/{a +=1;};END{print a;}' /your/file/goes/here

'^'は行の始まりを意味し、 '$'は行の終わりを意味するので、この2つを合わせると始まりと終わりの間に何もないという意味です。 CR-LFセパレータでこれがどのように行われるかを確認していません。

関連情報