변수 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
따라서 매개변수 대체 및 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}