다음 변수가 있습니다.
echo "|$COMMAND|"
반환하는
|
REBOOT|
첫 줄 바꿈을 어떻게 제거 할 수 있습니까?
\n
(16 진수 0x0A)는 거짓말 피드 (LF)라고합니다. \r
Windows 및 많은 네트워크 프로토콜에서 2 바이트 줄 끝 시퀀스 CR LF의 첫 번째 바이트로 사용되는 문자 캐리지 리턴 (CR) (16 진수 0x0D)과 는 다릅니다 .
다음 변수가 있습니다.
echo "|$COMMAND|"
반환하는
|
REBOOT|
첫 줄 바꿈을 어떻게 제거 할 수 있습니까?
\n
(16 진수 0x0A)는 거짓말 피드 (LF)라고합니다. \r
Windows 및 많은 네트워크 프로토콜에서 2 바이트 줄 끝 시퀀스 CR LF의 첫 번째 바이트로 사용되는 문자 캐리지 리턴 (CR) (16 진수 0x0D)과 는 다릅니다 .
답변:
tr
명령에 의해 대체 될 수 //
bashism :
COMMAND=$'\nREBOOT\r \n'
echo "|${COMMAND}|"
|
OOT
|
echo "|${COMMAND//[$'\t\r\n']}|"
|REBOOT |
echo "|${COMMAND//[$'\t\r\n ']}|"
|REBOOT|
참조 매개 변수 확장 및 인용 배쉬의 매뉴얼 페이지를 :
man -Pless\ +/\/pattern bash
man -Pless\ +/\\\'string\\\' bash
man -Pless\ +/^\\\ *Parameter\\\ Exp bash
man -Pless\ +/^\\\ *QUOTING bash
@AlexJordan의 요청에 따라 지정된 모든 문자 가 표시되지 않습니다 . 그렇다면 $COMMAND
공백이 있으면 어떻게 될까요?
COMMAND=$' \n RE BOOT \r \n'
echo "|$COMMAND|"
|
BOOT
|
CLEANED=${COMMAND//[$'\t\r\n']}
echo "|$CLEANED|"
| RE BOOT |
shopt -q extglob || { echo "Set shell option 'extglob' on.";shopt -s extglob;}
CLEANED=${CLEANED%%*( )}
echo "|$CLEANED|"
| RE BOOT|
CLEANED=${CLEANED##*( )}
echo "|$CLEANED|"
|RE BOOT|
곧:
COMMAND=$' \n RE BOOT \r \n'
CLEANED=${COMMAND//[$'\t\r\n']} && CLEANED=${CLEANED%%*( )}
echo "|${CLEANED##*( )}|"
|RE BOOT|
노트 : 세게 때리다한 extglob
옵션 (사용 가능합니다 shopt -s extglob
사용하기 위해) *(...)
구문.
COMMAND="RE BOOT"; echo "|${COMMAND//[$'\t\r\n ']}|"
반환|REBOOT|
\n
을 방지하기 위해 공간을 채울 수 있습니다. COMMAND="RE BOOT"; echo "|${COMMAND//[$'\t\r\n']}|"
반환 |RE BOOT|
됩니다.
${COMMAND//[$'\t\r\n']}
합니까? 나는 ${COMMAND//[\t\r\n]}
단순히 작동 할 것이라고 생각 했지만 그렇지 않았습니다. 무엇 $
을 위해 너무 작은 따옴표 기호는?
echo "|$COMMAND|"|tr '\n' ' '
줄 바꿈 (POSIX / Unix에서는 캐리지 리턴이 아님)을 공백으로 바꿉니다.
솔직히 말해서 bash에서 좀 더 건전한 것으로 전환하는 것에 대해 생각할 것입니다. 또는 처음에이 잘못된 데이터 생성을 피하십시오.
흠, 데이터의 출처에 따라 이것은 끔찍한 보안 구멍이 될 수도 있습니다.
tr -d '\n'
에 대한 떨어지는 대신 공백으로 대체
tr '\n' ' ' <<< "|$COMMAND|"
대신 사용echo ... | ...
"|${COMMAND//$'\n'}|"
모든 캐리지 리턴을 제거하여 변수를 정리하십시오.
COMMAND=$(echo $COMMAND|tr -d '\n')
tr -d '\r'
대신 해야하지 않습니까?
tr
. 단순히 COMMAND=$(echo $COMMAND)
비슷한 효과를 줄 것입니다. 그것은 아마도 새로운 과정을 불러 일으키는 악마의 스폰이지만, 여전히 인간의 눈에는 꽤 짧고 달콤합니다. 그리고 만약 당신이 당신의 인생에서 두 번이나 두 번 여유가 있다면 당신은 기꺼이 맞을 수 있습니다 :-).
사용 bash
:
echo "|${COMMAND/$'\n'}|"
(이 질문의 제어 문자 \n
는 캐리지 리턴 ( \r
) 이 아니라 '개행' ( )입니다. 후자는 REBOOT|
한 줄에 출력 됩니다.)
Bash Shell 매개 변수 확장 사용 ${parameter/pattern/string}
:
패턴은 단지 파일 이름 확장에서 같은 패턴을 생성하기 위해 확장된다. 매개 변수 가 확장되고 해당 값에 대한 가장 긴 패턴 일치 가 string 으로 대체됩니다 . [...] 문자열 이 null 인 경우 일치하는 패턴 은 삭제되고 / 다음 패턴 은 생략 될 수 있습니다.
또한 $''
ANSI-C 인용 구문을 사용하여 개행을 $'\n'
. 줄 바꿈을 직접 사용하는 것도 좋지만 덜 예쁘게 작동합니다.
echo "|${COMMAND/
}|"
#!/bin/bash
COMMAND="$'\n'REBOOT"
echo "|${COMMAND/$'\n'}|"
# Outputs |REBOOT|
또는 줄 바꿈 사용 :
#!/bin/bash
COMMAND="
REBOOT"
echo "|${COMMAND/
}|"
# Outputs |REBOOT|
tr을 사용하고 sed를 사용하여 \ r을 포함하여 여러 문자를 제거하는 예를 보여주기 위해 답변을 추가합니다. 그리고 hexdump를 사용하여 설명합니다.
제 경우에는 마지막 항목의 awk 인쇄로 끝나는 명령이 |awk '{print $2}'
에는 줄 에 캐리지 리턴 \ r과 따옴표가 포함되어 .
나는 사용했다 sed 's/["\n\r]//g'
캐리지 리턴과 따옴표를 모두 제거 할 수 있습니다.
나는 또한 사용할 수 있었다 tr -d '"\r\n'
.
sed -z
줄 바꿈 문자를 제거하려면 \ n 주목할 점이 필요합니다.
$ COMMAND=$'\n"REBOOT"\r \n'
$ echo "$COMMAND" |hexdump -C
00000000 0a 22 52 45 42 4f 4f 54 22 0d 20 20 20 0a 0a |."REBOOT". ..|
$ echo "$COMMAND" |tr -d '"\r\n' |hexdump -C
00000000 52 45 42 4f 4f 54 20 20 20 |REBOOT |
$ echo "$COMMAND" |sed 's/["\n\r]//g' |hexdump -C
00000000 0a 52 45 42 4f 4f 54 20 20 20 0a 0a |.REBOOT ..|
$ echo "$COMMAND" |sed -z 's/["\n\r]//g' |hexdump -C
00000000 52 45 42 4f 4f 54 20 20 20 |REBOOT |
그리고 이것은 관련이 있습니다. 캐리지 리턴, 줄 바꿈 및 용지 공급이란 무엇입니까?