문자열 변수에서 후행 개행 문자를 제거하는 중에 멈춤

문자열 변수에서 후행 개행 문자를 제거하는 중에 멈춤

때로는 쉘 스크립트를 정신없이 작성하는 동안 가장 간단한 일에도 몇 시간이 걸릴 수 있습니다.

Content='me \n you \n him \n'
echo $Content > Names.txt

열면 Names.txt끝에 두 개의 빈 줄이 있습니다.

빈 줄이 하나만 있기를 원합니다. 이 Content변수는 루프에서 평가되며 각 반복마다 새 행이 추가됩니다. 그래서 나는 바꿀 수 없습니다 Content.

echo -n새로운 줄을 모두 제거하기 때문에 사용할 수 없습니다 .

\n이 경우 모든 행이 서로 연결되어 있기 때문에 루프에서 제거 할 수 없습니다 .

Content=$(echo $Content | awk 'NR>1{print PREV} {PREV=$0} END{printf("%s",$0)}')후행 줄 바꿈 제거를 사용해 보았지만 awk작동하지 않습니다. 이 사이트의 답변에서 가져왔습니다.

printf %s $Content > File.txt대신 사용해 보았지만 echo -e여전히 성공하지 못했습니다.

주어진 문자열 변수에서 후행 개행 문자를 제거하거나 파일에 그대로 쓰고 Linux에 다른 줄을 추가하지 않도록 지시하려면 어떻게 해야 합니까?

답변1

이것은 두 번째 줄 바꿈을 추가하는 Linux가 아닙니다. 호출하면 bash입니다 echo!

따라서 답변은 쉘의 내장 함수 문서에서 찾을 수 있습니다 man builtins.

  echo [-neE] [arg ...]
          Output the args, separated by spaces, followed by a newline.
          The return status is 0 unless a write error occurs.  If -n
          is specified, the trailing newline is suppressed.

이제 echo -n트릭이 완료되었습니다. 실제로, echo -ne그렇지 않으면 -e파일에 리터럴 문자열이 포함되기 때문에 사용해야 합니다.

me \n you \n him \n

(그 안에 "백슬래시 n"이 있습니다!!)

echo -n은 모든 새 줄을 삭제하므로 사용할 수 없습니다.

아니요, 그렇게는 안 됩니다.


편집: 다음 명령 대화 상자와 그 출력은 실행 시 bash위의 설명을 확인합니다.

$ Content='me \n you \n him \n'
$ echo $Content > Names.txt
$ cat Names.txt 
me \n you \n him \n
$ echo -e "$Content" > Names.txt 
$ cat Names.txt 
me 
 you 
 him 

$ echo -en "$Content" > Names.txt
$ cat Names.txt 
me 
 you 
 him 
$ 

답변2

사용 printf형식 %b:

%b ARGUMENT는 '' 이스케이프로 해석되지만 8진수 이스케이프는 \0 또는 \0NNN으로 해석되는 문자열입니다.

$ Content='me \n you \n him \n'
$ printf "%b" "$Content" > Names.txt 
$ cat Names.txt 
me 
 you 
 him

답변3

echo 대신 printf를 인용하고 사용하는 것이 가장 좋습니다.

우선, 귀하의 설명이 일치하지 않습니다. with 변수가 있는 경우 with , nor , with or 가 'me \n you \n him \n'아닌 어디에도 개행 문자가 없습니다.echo $varprintf '%s' $varecho "$var"printf '%s' "$var"

$ var='me \n you \n him \n'
$ echo $var
me \n you \n him \n

개행 문자도 없고 종료 개행 문자도 없습니다(에코에 의해 추가된 것 제외).

나는 당신이 가지고 있는 것이 개행 문자가 있는 것이라고 믿습니다 \n. 그것은 다음과 같습니다:

$ var=$'me \n you \n him \n'
$ printf '%s' "$var"
me 
 you 
 him
$

여기 인용문은 (매우) 중요합니다.

$ printf '%s' $var
meyouhim$ 

.........

$ echo $var
meyouhim
$

.........

$ echo "$var"
me 
 you 
 him 

$

.....

echo에 의해 추가된 개행 문자가 표시되는 것을 확인하세요. 제거된 유일한 항목은 다음과 같습니다 echo -n.

$ echo -n "$var"
me 
 you 
 him 
$

이는 파일에 문제가 있는 것 같습니다. 두 개의 개행 문자(실제 $Contentvar에서 하나, echo에서 하나)로 끝납니다.

그것이 정말로 문제라면, a는 echo -n "$var" > Names.txt후행 개행 문자가 하나만 있는 파일을 제공할 것입니다.

아니면 다음과 같이 하는 것이 더 좋습니다:

$ Content=$'me \n you \n him \n' 
$ printf '%s' "$Content" > Names.txt
$ cat Names.txt 
me 
 you 
 him
$

관련 정보