텍스트 파일을 처리한 후 일부 문자가 사라집니다.

텍스트 파일을 처리한 후 일부 문자가 사라집니다.

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 문자를 "현재 줄의 시작 부분으로 돌아가기"로 해석합니다. 이는 .htmlCR 뒤의 비트가 줄의 시작 부분을 덮어쓰는 이유입니다.

당신은 할 수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이것이 문제를 해결했다고 말할 수 있습니다. 감사합니다! !

관련 정보