Bash에서 $'text'는 정확히 무엇을 합니까? Zsh에서 사용할 수 있나요?

Bash에서 $'text'는 정확히 무엇을 합니까? Zsh에서 사용할 수 있나요?

나는 최근에달리기다음 제안 솔루션을 입력하세요.

cat results.csv | tr $'\x01' \\t > result.csv

잘못된 형식의 csv 파일( \x01유니코드를 구분 기호로 사용하는 파일)을 변환하여 파일을 수정합니다.

$'\x01'은 bash에게 정확히 무엇을 하라고 지시하나요? 이 명령은 Zsh에서는 제대로 작동하지 않는 것 같습니다.

중요한 경우 실제 목표는 다음과 같이 변환하는 것입니다.

b'flight_uid\thaving_price\tbid_price\timpressions_source_timestamp\n'b'0FY6ZsrnMy\x012270.0\x011427243278000\n0FamrXG9AW\x01710\x01747.0\x011427243733000\n 0 FY6Zsrn 내\x012000\x012270.0\x011427245266000\n0FY6ZsrnMy\x012000\x012270 . 0\x011427245088000\n0FamrXG9AW\x01330\x01747.0\x011427243407000\n0FamrXG9AW\x01710\x01747.0\x011427243981000\n0FamrXG9AW\x014 90 \x01747.0\x011427245289000\n0FamrXG9AW\x01735\x01747.0\x011427244634000\n0FamrXG9AW\x01420\x01747 . 0\x011427245595000\n0FamrXG9AW\x01470\x01747.0\x011427242443000\n0FK9yvBt9B\x011050\x011295.0\x011427242253000\n0FK9yvBt9B \x 011050\x0112%

일반 탭으로 구분된 csv 파일로 변환합니다.

Zsh를 사용하여 이 작업을 시도하면 다음과 같은 결과를 얻었지만 아무 것도 변경되지 않는 것 같습니다.

b'flight_uid\thaving_price\tbid_price\timpressions_source_timestamp\n'b'0FY6ZsrnMy\x012270.0\x011427243278000\n0FamrXG9AW\x01710\x01747.0\x011427243733000\n 0 FY6Zsrn 내\x012000\x012270.0\x011427245266000\n0FY6ZsrnMy\x012000\x012270 . 0\x011427245088000\n0FamrXG9AW\x01330\x01747.0\x011427243407000\n0FamrXG9AW\x01710\x01747.0\x011427243981000\n0FamrXG9AW\x014 90 \x01747.0\x011427245289000\n0FamrXG9AW\x01735\x01747.0\x011427244634000\n0FamrXG9AW\x01420\x01747 . 0\x011427245595000\n0FamrXG9AW\x01470\x01747.0\x011427242443000\n0FK9yvBt9B\x011050\x011295.0\x011427242253000\n0FK9yvBt9B \x 011050\x0112%

답변1

Bash 문서에서:

Words of the form $'string' are treated specially.  The word expands to
string, with backslash-escaped characters replaced as specified by  the
ANSI  C  standard.  Backslash escape sequences, if present, are decoded
as follows:
       \a     alert (bell)
(...)
       \nnn   the eight-bit character whose value is  the  octal  value
              nnn (one to three digits)
       \xHH   the  eight-bit  character  whose value is the hexadecimal
              value HH (one or two hex digits)

따라서 게시한 예에서는 $'\x01'설명에 따라 코드 1이 있는 문자일 뿐입니다. 내 (매우 제한적인) 테스트에서 zsh는 이것을 지원하는 것 같습니다.

$ printf %s $'\x01' | od -t x1
0000000 01
0000001

그러나 tr게시한 명령은 주석에서 볼 수 있듯이 파일에 실제로 코드 1의 리터럴 문자가 포함되어 있다고 가정하는 경우에만 문제를 해결합니다. \x01탭 문자는 문자열이어야 합니다. 다음 필터는 이 문제를 해결해야 합니다.

sed 's/\\x01/\t/g'

관련 정보