특정 문자열을 변수(v1)에 로드합니다. 새 줄과 캐리지 리턴을 뺀 이 변수와 동일한 새 변수를 정의하려고 하므로 새 변수가 할당된 문자열에서 새 줄과 캐리지 리턴을 제거해야 합니다.
다음은 내가 수행하려는 작업의 예입니다(-->는 터미널 출력을 의미함).
v1="Hello\nThere"
v2= $(echo $v1 | tr -d '/n') #This yields the error below.
--> bash: Hello\nThere: No such file or directory
마찬가지로 "/n" 대신 "l"을 바꾸려고 하면 다음과 같은 결과가 나타납니다.
v2= $(echo $v1 | tr -d l)
--> bash: Heo\nThere: No such file or directory
두 번째 예에서는 "l"이 사라지지만 "해당 파일이나 디렉터리가 없습니다."라는 메시지가 나타나는데 무슨 의미인지 알 수 없습니다. 이 경우 이는 무엇을 의미합니까? 어떤 파일이나 디렉토리를 찾고 있습니까? echo 결과를 tr로 전송합니다. "해당 파일이나 디렉터리가 없습니다"라는 메시지가 표시될 때 그것이 무엇을 의미하는지 잘 모르겠습니다.
또한 새 변수를 할당하지 않고 이 작업을 수행하면 작동합니다.
echo $v1 | tr -d l
--> Heo\nThere
여기에 새 변수를 올바르게 할당하고 있습니까? 내가 사용하는 형식은 VariableName= $(expression) 입니다.
답변1
v1="Hello\nThere"
먼저, 중간에 백슬래시가 있는 문자 그대로 v1
문자열로 설정됩니다. Hello\nThere
리터럴 줄 바꿈을 포함하려면 (Bash/Ksh/Zsh에서) 다음을 사용할 수 있습니다.
v1=$'Hello\nThere'
또는 (POSIXly):
v1='Hello
There'
그러면 다음과 같습니다.
v2= $(echo $v1 | tr -d '/n')
그것은 마치 v2= somecommand
명령의 컨텍스트에서 v2=value somecommand
set을 사용하여 명령을 실행하는 것과 같습니다. v2
가지고 있는 줄을 사용하여 명령 대체를 확장하고 이를 Hello\nThere
첫 번째이자 유일한 단어로 토큰화하고 글로빙한 다음 명령으로 실행하려고 합니다( v2
환경이 빈 문자열로 설정됨).
경로에 아무것도 없기 때문에 실패합니다 Hello\nThere
. 따라서 오류 메시지가 표시됩니다 Hello\nThere: No such file or directory
.
쉘 변수 할당에는 공백을 사용할 수 없으며 를 사용해야 합니다 . 또한 사용하려는 v2=$(...)
변수 확장 및 인수 주위에 따옴표를 넣고 캐리지 리턴 도 제거해야 합니다.\n
tr
\r
예를 들어 Bash를 사용하면 "Hellothere"가 인쇄됩니다.
#/bin/bash
v1=$'Hello\nthere'
v2=$(echo "$v1" | tr -d '\n\r')
printf "%s\n" "$v2"
다음을 사용할 수 있는 경우 확장을 $''
사용하여 ${var/pattern/replacement}
개행 및 캐리지 리턴을 제거 할 수도 있습니다.
#/bin/bash
v1=$'Hello\r\nthere\r\n'
v2=${v1//[$'\n\r']}
printf "%s\n" "$v2"
(이중 슬래시는 모든 일치 항목을 대체합니다. 대체 부분이 없으면 일치 항목이 제거됩니다. 대괄호는 []
패턴 일치 의미를 유지하기를 원하므로 괄호를 인용해서는 안 되지만 내부 항목은 고려 \n\r
되어야 합니다. $''
백슬래시와 문자뿐만 아니라 NL 및 CR도 가능합니다.
바라보다:
답변2
원하는 명령은 다음과 같습니다.
v1="Hello\nThere"
v2=$(echo $v1 | tr -d '\\n')
이렇게 하면 개행 문자가 아닌 \n
리터럴로 해석되어 오류가 발생합니다. \n
사용하면 \\n
이 문제를 해결할 수 있습니다.
나중에 확인할 수 있습니다:
echo $v2
산출:
HelloThere