Bash
如何僅使用 bash 刪除兩種類型的換行符
變數 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}