쉘 스크립트에서는 줄 끝에 텍스트를 추가할 수 없습니다.

쉘 스크립트에서는 줄 끝에 텍스트를 추가할 수 없습니다.

파일에서 줄을 읽고 문자열을 추가하고 싶습니다. 그런데 제대로 붙어있지 않네요.

#! /bin/bash

FILE=$1
while IFS= read -r line
do
    line2="${line} &"
    echo $line2
done <$FILE

내 입력 파일에 다음이 포함되어 있습니다.

message
sample
text

예상 출력

message &
sample &
text &

그러나 스크립트를 실행한 후에는 아래와 같은 결과가 나타납니다.

 &ssage
 &mple
 &xt

끝에 문자열을 추가하지 않는 이유는 무엇입니까?

답변1

 &ssage
 &mple
 &xt

문제는 입력 파일(분명히 Windows에서 생성됨)에 CRLF 줄 끝이 있다는 것입니다.

고치다sed -i 's/\r//' file

답변2

문제는 입력 텍스트 파일이 DOS 텍스트 파일이라는 것입니다. 이는 각 줄이 캐리지 리턴 문자로 끝나는 것을 의미합니다. 출력 시 이 문자는 커서를 줄의 시작 부분으로 되돌립니다. 즉, echo이전 공백을 출력할 때는 &줄의 시작 부분에 기록됩니다.

텍스트 파일을 Unix 텍스트 형식으로 변환하려면 유사한 도구를 사용해야 합니다 dos2unix.

또한 값을 인쇄할 때 쉘 코드에서 인용하는 데 문제가 발생합니다 $line2. 변수 확장을 인용하지 않기 때문에 쉘은 값을 공백, 탭 및 줄 바꿈으로 분할하여 단어를 생성합니다. 이러한 단어는 echo와일드카드 패턴으로 전달되며 이러한 파일 이름으로 대체됩니다. 예를 들어, *위와 같은 입력 라인을 사용해 보십시오 .

어떤 경우에는 이 echo유틸리티가 출력하는 데이터를 수정하는 경향이 있으므로( \n리터럴 개행 등으로 확장), 입력 리터럴 데이터를 보존하려면 이 유틸리티를 사용해야 합니다 printf.

쉘 루프에서 텍스트를 한 줄씩 읽는 것도 약간 비효율적이며 다음과 같은 것을 통해 작업을 더 잘 수행할 수 있습니다 sed.

sed 's/$/ \&/' <"$1"

(줄 끝을 공백과 앰퍼샌드로 바꿉니다)

... 또는 awk,

awk '{ printf "%s &\n", $0 }' <"$1"

(각 줄을 공백으로 출력하고 &추가합니다. 또한 작동합니다 print $0, "&").

또한보십시오:

답변3

나는 이것을 재현할 수 없습니다.

방금 로컬에서 실행하고 쉽게 시험해 볼 수 있는 버전도 만들었습니다.https://www.onlinegdb.com/online_bash_shell.

while IFS= read -r line
do
    line2="${line} &"
    echo $line2
done <<EOM
message
sample
text
EOM

산출

message &
sample &
text &

관련 정보