
我有一個文件末尾有空行的文件。我可以使用grep
檔案名稱作為腳本中的變數傳遞來計算檔案末尾的空白行數嗎?
答案1
如果空行是僅有的在最後
grep -c '^$' myFile
或者:
grep -cx '' myFile
答案2
只是為了好玩,有些令人毛骨悚然sed
:
#!/bin/sh
sed '/./!H;//h;$!d;//d;x;s/\n//' "$1" | wc -l
解釋:
/./
尋址具有任何字元的行,因此/./!
尋址空行(例如/^$/
,但我想重複使用相反的模式);對於這些,該H
命令將它們附加到保留空間。因此,如果我們為每個空行添加一行到保留空間,則總是比空行的數量多一行。我們稍後會關心這個。//h
空模式匹配最後一個正則表達式,它是任何字符,因此任何非空行都會被尋址並且搬家了透過指令將收集的行「重設」為 1 到保留空間h
。$!d
停止腳本,除了最後一行之外的每一行都沒有輸出,因此僅在最後一行之後執行進一步的命令。因此,我們在保留空間中收集的任何空白行都位於文件的末尾。好的。//d
:d
僅對非空白行再次執行該指令。因此,如果最後一行不為空,sed
將退出且沒有任何輸出。零線。好的。x
交換保存空間和模式空間,因此收集到的行現在位於模式空間中處理。- 但我們記得一行太多了,所以我們用 刪除一個換行符來減少它
s/\n//
。 - 瞧!行數與末尾的空行數相符(注意第一行不會為空,但誰在乎呢),所以我們可以用 來計數
wc -l
。
答案3
更多 GNU tac
/tail -r
選項:
tac file | awk 'NF{exit};END{print NR?NR-1:0}'
或者:
tac file | sed -n '/[^[:blank:]]/q;p' | wc -l
請注意,在輸出上:
printf 'x\n '
也就是說,如果最後一個整行後面有一個額外的空格(有些人可能會將其視為額外的空行,但根據 POSIX 文字定義,不是有效文字),則這些空格將為 0。
POSIXly:
awk 'NF{n=NR};END{print NR-n}' < file
但這意味著完整讀取文件(tail -r
/tac
將從可查找文件的末尾向後讀取文件)。這給出1
了 的輸出printf 'x\n '
。
答案4
因為你實際上是在要求grep
解決方案我添加這個僅依賴 GNU grep
(好吧,也使用 shell 語法和echo
...):
#!/bin/sh
echo $(( $(grep -c "" "$1") - $(grep -B$(grep -cv . "$1") . "$1" |grep -c "") ))
我在這是要幹嘛?$(grep -c ".*" "$1")
計算檔案中的所有行,然後減去不帶尾隨空行的檔案。
以及如何獲得這些?$(grep -B42 . "$1"
會 grep 所有非空白行和它們之前的 42 行,因此只要非空白行之前不超過 42 個連續空白行,它就會列印直到最後一個非空白行的所有內容。為了避免這個限制,我將空白行的總數$(grep -cv . "$1")
作為選項的參數,因此總是足夠大。-B
這樣我就去掉了尾隨的空白行,並且可以用來|grep -c ".*"
計算行數。
太棒了,不是嗎? (-;