![なぜ `awk'/^[^\t]/{a++}END{print a}'' は空行を計算しないのですか?](https://linux33.com/image/125066/%E3%81%AA%E3%81%9C%20%60awk'%2F%5E%5B%5E%5Ct%5D%2F%7Ba%2B%2B%7DEND%7Bprint%20a%7D''%20%E3%81%AF%E7%A9%BA%E8%A1%8C%E3%82%92%E8%A8%88%E7%AE%97%E3%81%97%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F.png)
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セパレータでこれがどのように行われるかを確認していません。