変数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'は、2つの改行文字を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
改行には実際には2つのタイプはありません。これを渡すか、他のコマンド(バックスラッシュエスケープシーケンスとして解釈するなど)を\n
渡すまで、一連の文字しかありません。printf '%b'
echo -e
したがって、パラメータ置換とbashを使用してprintf '%b'
すべてのシーケンスを\n
改行文字に変換し、すべての改行文字を削除できます。C文字列:
v='ab\n cd
ef
'
printf -v w '%b' "$v"; printf '%s\n' "${w//$'\n'}"
ab cd ef
答え2
簡単にエコーが使えます。 -eと「がない場合、echoは\ nを文字列として扱い、パラメータ置換を使用して削除できます。
echo ${v//\\n}