Bash

如何僅使用 bash 刪除兩種類型的換行符

  • March 11, 2018

變數 v 有 \n 和,嗯,另一種類型的換行符??

v='ab\n cd
ef
'
printf '%b' "$v"
ab
cd
ef
printf '%s' "$v"
ab\n cd
ef
printf '%s' "$v" | xxd
00000000: 6162 5c6e 2063 640a 2065 660a            ab\n cd. ef.
printf '%b' "$v" | xxd
00000000: 6162 0a20 6364 0a20 6566 0a              ab. cd. ef.

printf ‘%b’ 將兩個換行符都顯示為 ASCII 10 字元。

我的函式刪除了兩種類型的換行符,但它對每種類型使用不同的過程。

remove() {
 local str="$1" chr='\\n\\t\\r' idx
 for (( idx=0; idx<${#chr}; idx+=$((${#chr} / 3)) )); do   
   str="${str//${chr:${idx}:3}}"
 done
 str=${str//[$'\n\t\r']}
 printf "${str}"
}

有沒有更好的方法來只使用 Bash 來處理這兩個問題?

我正在使用 GNU bash 4.4.19。

實際上沒有兩種類型的換行符。\n只是一個字元序列,直到您將其傳遞給printf '%b'或某些其他命令,例如將echo -e其解釋為反斜杠轉義序列。

因此,您可以使用printf '%b'將任何\n序列轉換為換行符,然後使用參數替換和 bash C-string刪除所有換行符:

v='ab\n cd                     
ef
'
printf -v w '%b' "$v"; printf '%s\n' "${w//$'\n'}"
ab cd ef

您可以簡單地使用迴聲。沒有 -e 和 “, echo see \n as string,您可以使用參數替換將其刪除。

echo ${v//\\n}

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