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

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

관련 정보