如何仅使用 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。

答案1

实际上并没有两种类型的换行符;\n只是一个字符序列,直到您将其传递给printf '%b'或其他一些命令(例如echo -e将其解释为反斜杠转义序列)。

因此,您可以使用printf '%b'将任何序列转换\n为换行符,然后使用参数替换和 bash 删除所有换行符C 弦:

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

答案2

您可以简单地使用 echo 。如果没有 -e 和 ",echo 将 \n 视为字符串,您可以使用参数替换将其删除。

echo ${v//\\n}

相关内容