programing

Bash에서 문자열에서 새 줄을 제거하는 방법

starjava 2023. 4. 27. 21:45
반응형

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

반응형