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
이렇게 하면 0의 개수 결과는 비어 있지 않고 0이 됩니다.
반면에 정규 표현식에는 다음이 [^\t]
필요합니다.일부문자인 경우 탭 문자를 사용할 수 없습니다.
빈 줄을 일치시키려면 /^$/
또는 $0 == ""
. 또는 빈 줄이나 공백만 포함된 줄을 일치시킵니다 /^[[:space:]]*$/
.
답변3
정규식에서는 [^\t]
"아무것도 일치하지 않음"을 의미하지 않습니다 \t
. "를 제외한 모든 문자 와 일치"를 의미합니다 \t
. 주요 차이점은 일치하는 문자가 하나 있어야 한다는 것입니다. 빈 줄이면 빈 줄이 없습니다.
답변4
일치 표현식 /^[^\t]/에 "탭으로 시작하지 않는 줄"이라고 적혀 있다는 것을 읽었습니다. 정말 빈 줄을 찾고 있다면 다음과 같이 하면 됩니다.
awk '/^$/{a +=1;};END{print a;}' /your/file/goes/here
'^'은 줄의 시작을 의미하고 '$'는 줄의 끝을 의미하므로 이 둘을 합치면 시작과 끝 사이에 아무 것도 없다는 의미입니다. CR-LF 구분선에서 이것이 어떻게 수행되는지 확인하지 않았습니다.