Address.txt라는 파일이 있습니다.
[email protected]
[email protected]
[email protected]
나는 그것을 반향하고 싶다”[이메일 보호됨]"for 루프를 사용하세요. 제가 한 일은 다음과 같습니다.
cat addresses.txt | while read address
do
echo "${address}.html"
done
결과는 다음과 같습니다.
[email protected]
[email protected]
[email protected]
변수와 ".html" 사이에 공백을 추가하면 같은 결과가 나타납니다.
내가 무엇을 놓치고 있나요?
감사해요
답변1
무슨 일이 일어나는가는 파일이 Windows 형식이라는 것입니다.개행 문자CR과 LF라는 두 문자의 조합으로 표현됩니다. 사용 중인 Unix 도구에서는 개행 문자가 LF 문자만 사용하여 Unix 방식으로 표현될 것으로 예상합니다. 쉘은 CR(캐리지 리턴)을 일반 문자로 처리하므로 변수 value 의 일부가 됩니다 address
. 터미널에서 결과를 인쇄할 때 터미널은 CR 문자를 "현재 줄의 시작 부분으로 돌아가기"로 해석합니다. 이는 .html
CR 뒤의 비트가 줄의 시작 부분을 덮어쓰는 이유입니다.
당신은 할 수Unix 개행 문자를 사용하도록 파일 변환.
코드가 Windows 개행 문자로 인코딩된 입력 파일에 대해 강력해지도록 하려면 CR을 다음에 추가하면 됩니다.IFS
바꾸다.
while IFS="$IFS$(printf '\r')" read address; do
echo "${address}.html"
done <addresses.txt
또 다른 해결 방법은 값 끝(있는 경우)에서 CR 문자를 제거하는 것입니다.매개변수 확장문자열 조작 구성. 파일에 실제로 백슬래시-CR-새줄이 포함되어 있으면 줄 연속을 위한 백슬래시-새줄이 작동하지 않으므로 혼동을 피하기 위해 이를 꺼야 합니다.
CR=$(printf '\r')
while read -r address; do
address=${address%$CR}
echo "${address}.html"
done <addresses.txt
$'\r'
ksh93에서는 bash 및 zsh를 대신 사용할 수 있습니다 $(printf '\r')
.
답변2
누군가 나에게 시도해 보라고 제안했고 dos2unix addresses.txt
이것이 문제를 해결했다고 말할 수 있습니다. 감사합니다! !