Newlines

如何列印行號但在空行重置行計數器?

  • August 25, 2020

我有一個 file.txt 包含:

this is the first
second line
not last line

fourth but first
second in list
seventh in file
seventh with nl

通常我會像這樣通過cat管道|輸入nl

$> cat file.txt | nl
1  this is the first
2  second line
3  not last line

4  fourth but first
5  second in list
6  seventh in file
7  seventh with nl 

但是當遇到這樣的空行時,我需要重置行號:

$> alias_or_function file.txt
1  this is the first
2  second line
3  not last line

1  fourth but first
2  second in list
3  seventh in file
4  seventh with nl 

我怎麼能在我的 中使用快速函式或別名來做到這一點~/.zshrc

您可以將空白行替換\:\:nl新頁面正文的開始:

<your-file sed 's/^[[:space:]]*$/\\:\\:/' | nl

所以作為一個函式:

number-lines-of-paragraphs() {
 sed -e 's/^[[:space:]]*$/\\:\\:/' -- "$@" | nl
}

(請注意,如果它們也出現在輸入中,nl將理解為頁眉/正文/頁腳分隔符,這就是為什麼您通常不能使用將行號添加到任意文本的原因)。\:``\:\:``\:\:\:``nl

您還可以獲得相同的輸出格式,而無需使用以下警告awk

awk 'NF {printf "%6u\t%s\n", FNR, $0; next}; {FNR = 0; print}'

或者其他人在這裡發布的一些變體。

上面,數字被填充為 6 個字元,後跟一個 TAB 字元,如預設nl輸出格式(%6u\t%s\n相當於nl’s default -s $'\t' -n rn -w 6),但您當然可以根據自己的喜好調整該格式。

但是現在,要使其成為一個將任意文件名作為參數的函式,這就是您遇到awk自己的警告的地方,即它會阻塞包含=字元的文件名,因為這些字元被解釋為 awk 變數賦值(至少如果第一個左邊=看起來像一個有效的 awk 變數名)。可以通過以下方式解決gawk

number-lines-of-paragraphs() {
 gawk -e '
   NF {printf "%6u\t%s\n", FNR, $0; next}
   {FNR = 0; print}' -E /dev/null "$@"
}

請注意,如果該函式傳遞了多個文件,則行號將在每個文件的開頭重置。如果您希望將所有文件的內容作為單個流作為一個整體進行編號,就像sed | nl方法中一樣,請替換FNRNR上面的內容。

在任何情況下,sedgawk都將理解-為表示標準輸入,而不是-目前目錄中呼叫的文件(用於./-解決它)。

引用自:https://unix.stackexchange.com/questions/605703