때로는 쉘 스크립트를 정신없이 작성하는 동안 가장 간단한 일에도 몇 시간이 걸릴 수 있습니다.
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 $var
printf '%s' $var
echo "$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
$
이는 파일에 문제가 있는 것 같습니다. 두 개의 개행 문자(실제 $Content
var에서 하나, 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
$