에코된 문자열 사이의 간격을 무시합니다.

에코된 문자열 사이의 간격을 무시합니다.

echo다음 두 명령 중 하나를 사용하여 두 문자열을 파일에 인쇄합니다 .

echo -e "\n""x" >> ~/file
echo -e "\n" "x" >> ~/file

첫 번째 결과는 다음과 같습니다.

엑스

두 번째 결과는 다음과 같습니다.

엑스

여분의 공간도 놓치지 않으셨을 것 같아요.

나는 두 번째 명령이 첫 번째 명령과 유사하게 작동하기를 가장 원합니다. "\n"와 사이에 추가 공간이 있어 "x"명령을 더 편안하게 읽을 수 있기 때문입니다.

Bash 4.3.48(1)에서는 이것이 자연적으로 불가능하다는 점을 감안할 때 이를 허용하거나 최소한 이에 가까운 구문이 있습니까?

주요 목표는 더 편안하게 읽을 수 있도록 두 문자열 사이에 일종의 분리를 제공하지만 위에 추가 공간을 두지 않는 간격 또는 최소한 일부 자리 표시자/구분 기호를 갖는 것입니다.

아시는 방법을 보여주세요. 나는 다른 것을 사용할 의향이 있습니다 echo(비록 여기서 문자열을 피하는 것을 선호하지만).


""를 의미하기 위해 "문자열"이라는 용어를 사용했다는 점에 유의하세요 \n. 여기서 말하는 것이 맞는지 잘 모르겠지만, 이것을 설명하는 데 사용할 수 있는 가장 좋은 용어입니다.

답변1

다음 명령을 사용하여 이 작업을 수행할 수 있습니다 printf.

printf '\n%s\n' 'x' >file

를 사용하면 공백을 제거하여 이 작업을 수행 echo할 수 있습니다 tr.

echo -e '\n x' | tr -d ' ' >file

다음과 같이 작성할 수도 있습니다(그러나 그렇게 하지 마십시오).

echo -e '\n' 'x' | tr -d ' ' >file

결과:

$ cat file

x

나는 이것이 실제로 당신이 주문할 수 있다고 쉽게 주장할 수 있다고 생각합니다.더 세게읽다.

답변2

핵심이 스크립트 소스에서 두 문자열을 시각적으로 구분하는 것이라면(sum here \n) 이를 변수에 넣을 수 있을 것 같습니다.x

str1='\n'
str2='x'
echo -e "$str1$str2" >> file

물론 매개변수 확장은 연속적이지만 문자열 자체는 그렇지 않습니다.

또는 를 사용 printf하지만 후행 개행 추가는 별도로 수행해야 합니다.

{ printf %s $'\n' 'x'; echo; } >> file

%s물론 백슬래시 이스케이프 문자는 매개변수 문자열에서 확장되지 않지만 Bash에서는 $'...'ANSI-C 따옴표를 사용하여 echo최종 개행 문자를 얻을 수 있습니다.

또는 원하는 작업을 수행하는 함수를 정의하십시오( 여기서 지워진 "$*"대로 구분 기호 없이 매개변수를 함수에 연결하십시오 ).IFS

output() { local IFS=; echo -e "$*"; }
output "\n" "x"

답변3

x목표가 파일에 새 줄과 a(그리고 또 다른 줄 바꿈?)를 구체적으로 쓰는 것이고 and (즉,  )가 명령에 연속적으로 n나타나지 않는 경우 (그리고 출력에 원치 않는 공백이 포함되지 않는 경우) 다음 중 하나가 매우 간단합니다. 방법은xnx

{ echo; echo "x";} >> file

(개행, x, 개행 작성) 또는

{ echo; echo -n "x";} >> file

(개행 문자와 를 쓰지만 x끝에 개행 문자는 없습니다). 그룹화를 위해 중괄호 대신 괄호를 사용할 수도 있습니다.

(echo; echo "x") >> file

중괄호를 사용하는 경우 시작 뒤에 공백(공백, 탭 및/또는 줄 바꿈)이 있어야 하고 끝 앞에 {하나(및/또는 줄 바꿈)가 있어야 합니다 . 또는 두 개의 완전히 별개(그룹화되지 않은) 명령을 실행하여 독립적으로 리디렉션을 수행할 수 있습니다.;}

echo     >> file
echo "x" >> file

또는 사용Jesse_b의 답변:

printf '\n%s\n' 'x' >> file

(개행, x, 개행 작성) 또는

printf '\n%s'   'x' >> file

(개행 문자와 를 쓰지만 x끝에 개행 문자는 없습니다).


그러나 목표가 보다 일반적인 것이라면, 명령줄에서 공백으로 구분하면서 여러 문자열(사이에 공백 없이)을 작성하는 것이라면 다음을 고려하십시오.

printf '%b'끈…

인쇄된 문자열 %b의 변환 형식 그리고 \ 서열 해석( %s문자열을 문자 그대로 인쇄하는 것과 반대) 예를 들어,

printf '%b' '\n' foo '\t' bar

IE를 쓸 것이다 newlinefootabbar;

 
풍부한 바
(끝에 개행 문자가 없습니다). 당신은 또한 말할 수 있습니다

printf '%b%b%b%b' '\n' foo '\t' bar

하지만 그렇지 않습니다. 모든 매개변수를 표시하는 데 필요한 만큼 형식이 적용됩니다. 따라서 끝에 개행 문자를 추가하려면

printf '%b\n' '\n' foo '\t' bar

작동하지 않습니다. 각 매개변수 뒤에 줄바꿈을 추가합니다. 넌 할 수있어

printf '%b' '\n' foo '\t' bar '\n'

(마지막 인수로 개행 문자 추가) 또는

printf '%b%b%b%b\n' '\n' foo '\t' bar

(계산 매개변수) 또는

{ printf '%b' '\n' foo '\t' bar; echo;}

또 다른 방법또는 bash를 사용하는 경우

printf '%s' $'\n' foo $'\t' bar

시퀀스를 해석하려면 bash 표기법을 사용하세요. 이것을 원래 문제에 적용하면,$'text…'\

printf '%s' $'\n' x

답변4

%bbash printf(백틱 인수 설명)를 사용할 수 있습니다 .

$ printf  %b  \\n  x  >> file

물론 다음과 같이 인용할 수도 있습니다 \n.

$ printf  %b  '\n'  x  >> file

x그러나 backtick 값은 printf에 의해 해석되지 않으므로 printf에 입력하는 내용에 대해 매우 주의하십시오 .

또는 bash를 사용하고 있으므로 다음을 사용하여 개행을 생성할 수 있습니다 $'\n'.

$ printf '%s' $'\n' x >>file

보다 안전합니다 %b.

또는 변수를 원하는 경우:

$ nl=$'\n'
$ printf '%s' "$nl" x >> file

또는 다음과 같이 함수를 정의할 수 있습니다.

$ separate() { local IFS=; printf %b "$*"; }
$ separate '\n' 'x' '*'

매개변수가 함께 연결되었는지 확인 합니다 local IFS=(사이에 공백 없음)."$*"

관련 정보