Bash의 문자열에서 줄 바꿈을 제거하는 방법
다음 변수가 있습니다.
echo "|$COMMAND|"
반환하는
|
REBOOT|
첫 줄 바꿈을 어떻게 제거 할 수 있습니까?
bash 아래 에는 몇 가지 바 시즘이 있습니다.
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|
참고 : bash 에는 구문 을 사용하기 위해 extglob
활성화 ( shopt -s extglob
) 할 수 있는 옵션이 있습니다 *(...)
.
echo "|$COMMAND|"|tr '\n' ' '
줄 바꿈 (POSIX / Unix에서는 캐리지 리턴이 아님)을 공백으로 바꿉니다.
To be honest I would think about switching away from bash to something more sane though. Or avoiding generating this malformed data in the first place.
Hmmm, this seems like it could be a horrible security hole as well, depending on where the data is coming from.
Clean your variable by removing all the carriage returns:
COMMAND=$(echo $COMMAND|tr -d '\n')
Using bash
:
echo "|${COMMAND/$'\n'}|"
(Note that the control character in this question is a 'newline' (\n
), not a carriage return (\r
); the latter would have output REBOOT|
on a single line.)
Explanation
Uses the Bash Shell Parameter Expansion ${parameter/pattern/string}
:
The pattern is expanded to produce a pattern just as in filename expansion. Parameter is expanded and the longest match of pattern against its value is replaced with string. [...] If string is null, matches of pattern are deleted and the / following pattern may be omitted.
Also uses the $''
ANSI-C quoting construct to specify a newline as $'\n'
. Using a newline directly would work as well, though less pretty:
echo "|${COMMAND/
}|"
Full example
#!/bin/bash
COMMAND="$'\n'REBOOT"
echo "|${COMMAND/$'\n'}|"
# Outputs |REBOOT|
Or, using newlines:
#!/bin/bash
COMMAND="
REBOOT"
echo "|${COMMAND/
}|"
# Outputs |REBOOT|
Adding answer to show example of stripping multiple characters including \r using tr and using sed. And illustrating using hexdump.
In my case I had found that a command ending with awk print of the last item |awk '{print $2}'
in the line included a carriage-return \r as well as quotes.
I used sed 's/["\n\r]//g'
to strip both the carriage-return and quotes.
I could also have used tr -d '"\r\n'
.
Interesting to note sed -z
is needed if one wishes to remove \n line-feed chars.
$ 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 |
And this is relevant: What are carriage return, linefeed, and form feed?
- CR == \r == 0x0d
- LF == \n == 0x0a
You can simply use echo -n "|$COMMAND|"
.
If you are using bash with the extglob option enabled, you can remove just the trailing whitespace via:
shopt -s extglob
COMMAND=$'\nRE BOOT\r \n'
echo "|${COMMAND%%*([$'\t\r\n '])}|"
This outputs:
|
RE BOOT|
Or replace %% with ## to replace just the leading whitespace.
What worked for me was echo $testVar | tr "\n" " "
Where testVar contained my variable/script-output
참고 URL : https://stackoverflow.com/questions/19345872/how-to-remove-a-newline-from-a-string-in-bash
'Programming' 카테고리의 다른 글
JQuery를 사용한 노란색 페이드 효과 (0) | 2020.08.22 |
---|---|
C #에서 문자열의 ASCII 값을 얻는 방법 (0) | 2020.08.22 |
jquery를 사용하여 div 내의 텍스트 만 교체 (0) | 2020.08.22 |
오늘 DateTime이 발생하는지 확인하는 방법은 무엇입니까? (0) | 2020.08.22 |
Angular에서 앱 버전을 표시하는 방법은 무엇입니까? (0) | 2020.08.22 |