Bash

如何刪除 bash 中的尾隨換行符?

  • September 25, 2020

我正在尋找行為類似於 Perl 的東西chomp。我正在尋找一個簡單地列印其輸入的命令,如果它是換行符則減去最後一個字元:

$ printf "one\ntwo\n" | COMMAND_IM_LOOKING_FOR ; echo " done"
one
two done
$ printf "one\ntwo" | COMMAND_IM_LOOKING_FOR ; echo " done"
one
two done

(Bash 和 Zsh 中的命令替換會刪除所有尾隨新行,但我正在尋找最多刪除一個尾隨新行的東西。)

這應該有效:

printf "one\ntwo\n" | awk 'NR>1{print PREV} {PREV=$0} END{printf("%s",$0)}' ; echo " done"

該腳本始終列印前一行而不是目前行,並且最後一行的處理方式不同。

它更詳細地做了什麼:

  1. NR>1{print PREV}列印上一行(第一次除外)。
  2. {PREV=$0}將目前行儲存在PREV變數中。
  3. END{printf("%s",$0)}最後,列印最後一行而不換行。

另請注意,這將在末尾最多刪除一個空行(不支持刪除"one\ntwo\n\n\n")。

您可以perl不使用chomp

$ printf "one\ntwo\n" | perl -0 -pe 's/\n\Z//'; echo " done"
one
two done

$ printf "one\ntwo" | perl -0 -pe 's/\n\Z//'; echo " done"
one
two done

但是為什麼不使用chomp它自己:

$ printf "one\ntwo\n" | perl -pe 'chomp if eof'; echo " done"

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