Bash에서 문자열에서 새 줄을 제거하는 방법
저는 다음과 같은 변수를 가지고 있습니다.
echo "|$COMMAND|"
어느 쪽이 돌아옵니까?
|
REBOOT|
어떻게 하면 첫 번째 줄을 제거할 수 있습니까?
바시 아래에는 몇 가지 바시즘이 있습니다.
그tr
명령을 다음으로 대체할 수 있습니다.${parameter/pattern/string}
바시즘:
COMMAND=$'\nREBOOT\r \n'
echo "|${COMMAND}|"
|
OOT
|
echo "|${COMMAND//[$'\t\r\n']}|"
|REBOOT |
echo "|${COMMAND//[$'\t\r\n ']}|"
|REBOOT|
bash의 man 페이지에서 매개 변수 확장 및 견적을 참조하십시오.
man -Pless\ +/parameter/pattern/string bash
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|
참고: bash haveextglob
활성화할 옵션(shopt -s extglob
를 사용하기 위해*(...)
통사론
모든 라인 피드를 제거하여 변수를 정리합니다.
COMMAND=$(echo $COMMAND|tr -d '\n')
echo "|$COMMAND|"|tr '\n' ' '
새 줄(POSIX/Unix에서는 캐리지 리턴이 아님)을 공백으로 바꿉니다.
솔직히 저는 bash에서 좀 더 제정신인 것으로 바꾸는 것에 대해 생각해 볼 것입니다.또는 처음부터 잘못된 형식의 데이터를 생성하지 않도록 해야 합니다.
흠, 이것은 데이터가 어디서 나오느냐에 따라 끔찍한 보안 구멍이 될 수도 있는 것처럼 보입니다.
사용.bash
:
echo "|${COMMAND/$'\n'}|"
(이 질문의 제어 문자는 '새 줄'입니다.)\n
), 캐리지 리턴 아님(\r
); 후자는 출력을 가질 것입니다.REBOOT|
한 줄로.)
설명.
Bash Shell 매개 변수 확장 사용 ${parameter/pattern/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을 포함한 여러 문자를 제거하는 예를 보여주는 답변을 추가합니다.헥스 덤프를 사용한 그림입니다.
제 경우 마지막 항목의 인쇄가 어색하게 끝나는 명령을 발견했습니다.|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 |
그리고 이것은 관련이 있습니다.캐리지 리턴, 라인피드 및 폼피드란 무엇입니까?
- CR == \r == 0x0d
- LF == \n == 0x0a
제게 효과가 있었던 것은echo $testVar | tr "\n" " "
testVar에 내 변수/스크립트-출력이 포함된 위치
extglobal 옵션을 사용하도록 설정한 상태에서 bash를 사용하는 경우 다음을 통해 뒤에 오는 공백만 제거할 수 있습니다.
shopt -s extglob
COMMAND=$'\nRE BOOT\r \n'
echo "|${COMMAND%%*([$'\t\r\n '])}|"
다음 출력은 다음과 같습니다.
|
RE BOOT|
또는 %%를 ##으로 대체하여 선행 공백만 대체합니다.
간단히 사용할 수 있습니다.echo -n "|$COMMAND|"
.
$ man echo
-n
line 출력 안
실제 문제의 한 가지 가능한 루트를 해결하기 위해 crlf 파일을 원본으로 사용할 가능성이 있습니다.
CRLF 예:
.env(crlf)
VARIABLE_A="abc"
VARIABLE_B="def"
run.sh
#!/bin/bash
source .env
echo "$VARIABLE_A"
echo "$VARIABLE_B"
echo "$VARIABLE_A $VARIABLE_B"
반환:
abc
def
def
그러나 LF로 변환하는 경우:
.env(lf)
VARIABLE_A="abc"
VARIABLE_B="def"
run.sh
#!/bin/bash
source .env
echo "$VARIABLE_A"
echo "$VARIABLE_B"
echo "$VARIABLE_A $VARIABLE_B"
반환:
abc
def
abc def
이러한 간단한 작업에 대해 (tr, sed 또는 awk)와 같은 프로세스를 생성하지 않으려면 이 바시즘을 사용합니다.Bash는 혼자서 할 수 있습니다.
COMMAND=${COMMAND//$'\n'/}
설명서에서 다음을 참조하십시오.
${FOO//from/to} Replace all
${FOO/from/to} Replace first match
Grep은 빈 줄을 필터링하는 데 사용할 수 있습니다.이것은 여러 줄의 데이터가 있고 빈 데이터를 제거하려는 경우에 유용합니다.
echo "$COMMAND" | grep .
언급URL : https://stackoverflow.com/questions/19345872/how-to-remove-a-newline-from-a-string-in-bash
'programing' 카테고리의 다른 글
튜플 목록을 여러 목록으로 변환하는 방법은 무엇입니까? (0) | 2023.05.02 |
---|---|
IEnumberable에서 목록으로 변환 (0) | 2023.05.02 |
메이븐 관리 종속성에 대한 Eclipse에 연결된 소스 jar 파일 가져오기 (0) | 2023.04.27 |
선택 태그(Angular 2)에서 ngModel 변경을 감지하려면 어떻게 해야 합니까? (0) | 2023.04.27 |
현재 실행 중인 리눅스 프로세스를 백그라운드로 어떻게 배치할 수 있습니까? (0) | 2023.04.27 |