캐리지 리턴으로 인해 sed가 모든 파일을 읽을 수 없습니다.

캐리지 리턴으로 인해 sed가 모든 파일을 읽을 수 없습니다.

긴 폴더 목록이 있고 각 폴더에는 "log.dat" 파일이 있습니다. 이 파일의 특정 줄의 값을 읽고 싶습니다. 폴더 이름을 상위 폴더의 "All.txt" 파일에 저장한 후 다음 코드를 실행합니다.

#!/bin/bash
in=/a/b/c   #path to the file All.txt  
for i in $(cat $in/all.txt); do
sed -n '/price/p' ${in}/${i}/log.dat

done

이 코드는 거의 모든 파일을 읽을 수 있지만 어떤 이유로인지 이해할 수 없습니다! 다음과 같은 오류 메시지가 출력되었습니다.

/log.dat: No such file or directory #(then the path to this file)

sed -n '/price/p' log.dat폴더 내에서 명령을 실행하면 오류 메시지가 출력됩니다. 나는 대답을 얻었다!

추신: ALL.txt 파일(상위 폴더에서 명령을 실행하여 생성됨)의 내용은 ls>All.txt다음과 같습니다.

STR-548-021-01
STR-548-021-02
STR-548-022-01
STR-548-022-02
STR-548-023-01
STR-548-023-02
.
.
.
.
.

다음과 같이 "sed" 대신 "awk" 명령을 사용해 보았습니다.

awk '{ price }' ${in}/${i}/log.dat

동일한 오류 메시지가 나타납니다.

이러한 캐리지 리턴이 Linux에서 ls>All.txt 명령의 출력으로 나타날 수 있습니까?

답변1

가지다입력하다의 줄 끝에 $i캐리지 리턴 문자가 있기 때문입니다 all.txt. 아마도 Windows에서 생성되었을 것입니다. Windows는 두 문자 시퀀스 CR, LF를 사용하여 개행을 표시하는 반면 Unix(및 전 세계 대부분의 다른 곳)는 LF(유닉스 세계에서 개행과 동의어인 개행)만 사용하므로 Unix는 끝에 CR이 있는 줄을 확인하세요.

파일을 Unix 줄 끝으로 변환하거나 CR을 제거하십시오.

for i in $(cat $in/all.txt); do
  i=${i%$'\r'}
  sed -n '/price/p' ${in}/${i}/log.dat
done

줄 끝에 CR이 없으면 아무 작업도 수행되지 않습니다. 설명하다:$'\r' 캐리지 리턴 문자입니다., 그리고${i%…} i지정된 접미사를 뺀 값입니다.

스크립트에는 한 줄에 하나의 파일이 아닌 공백으로 구분된 입력이 필요하며 입력은 파일 이름이 아닌 와일드카드 패턴 목록입니다. 바라보다공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?. 입력에 공백이나 와일드카드가 없으면 아무런 차이가 없습니다.

답변2

오류 메시지는 sed가 /log.dat에 대한 매개변수를 가져오고 있음을 나타냅니다. $i나 $in이 어떤 값으로도 설정되지 않았습니다. All.txt 파일에 빈 줄이 있는 것 같습니다.

/log.dat: 해당 파일이나 디렉터리가 없습니다 #(그 다음 파일 경로)

관련 정보