![쉘 스크립트에서는 줄 끝에 텍스트를 추가할 수 없습니다.](https://linux55.com/image/201445/%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%EB%8A%94%20%EC%A4%84%20%EB%81%9D%EC%97%90%20%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%B6%94%EA%B0%80%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
파일에서 줄을 읽고 문자열을 추가하고 싶습니다. 그런데 제대로 붙어있지 않네요.
#! /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 &