일반 파일만 "sed -i"에 전달

일반 파일만 "sed -i"에 전달

sed저는 GNU sed 4.2.2를 사용하고 있는데 검색한 후에 어떤 경우에는 왜 이상하게 동작하는지 알 수 없습니다 .

다음 내용이 포함된 디렉토리가 있습니다.

foofile.txt
barfile.txt
bazfile.txt
config/

사례 1

sed -i 's/foo/bar/g' *.txt

이것은 내가 예상한 대로 작동합니다. 세 개의 일반 파일에서 모든 "foo"를 "bar"로 대체합니다.

사례 2

sed -i 's/foo/bar/g' *
sed: couldn't edit config: not a regular file

barfile.txt에서는 "foo"를 "bar"로 바꾸지만 bazfile.txt에서는 그렇지 않습니다 foofile.txt. 알파벳순으로 확장된 파일 목록을 살펴보고 오류가 *발생하면 종료된다고 가정합니다. 오류를 무시하고 파일 처리를 계속할 수 있는 config/방법이 있습니까 ?sed

사례 3

for file in $(find . -maxdepth 1 -type f); do sed -i 's/foo/bar/g' <"$file"; done
sed: no input files
sed: no input files
sed: no input files

sed왜 이런 일이 일어나는지 설명해 줄 수 있나요 ? 입력 파일을 제공할 때 입력 파일이 없다고 나타나는 이유는 무엇입니까?

나는 다음을 사용할 수 있다는 것을 알고 있지만 이 사용 사례를 해결하는 방법이 아니라 sed가 왜 이것을 수행하는지 묻고 있습니다.

find . -maxdepth 1 -type f -exec sed -i 's/foo/bar/g' {} \;

답변1

  • 사례 2:

    이 디렉토리를 피하려면 다음 명령을 사용하십시오 find.

      sed -i 's/foo/bar/g' $(find . -maxdepth 1 -type f)
    
  • 사례 3:

    문제는 <"$file"루프에 있으며 파일을 스트림으로 변환하므로 sed파일 이름이 표시되지 않습니다. 그냥 삭제하세요 <:

      for file in $(find . -maxdepth 1 -type f); do 
          sed -i 's/foo/bar/g' "$file"
      done
    

답변2

이는 정상적인 동작입니다. 두 경우 모두 ...per sed로 종료합니다 .error code 4info sed

4
     An I/O error, or a serious processing error during runtime,
     GNU 'sed' aborted immediately.

두 경우 모두 메시지는 설명이 필요하지 않습니다. 무엇이 불분명한지는 확실하지 않지만 기록을 위해: 처음에는 디렉토리를 편집할 수 없기 때문에 오류가 발생하고, 두 번째에는 stdin편집할 수 없기 때문에 불평하며 파일이 필요합니다(예: 이전 리디렉션 삭제 $file).
올바른 방법 find당신이 지적했듯이 glob을 사용하여 이를 수행하려면 -exec ...
루프를 사용하고 실행하기 전에 입력이 일반 파일인지 테스트해야 합니다 sed. 또는 사용자인 경우 zsh간단히 다음을 수행할 수 있습니다.

sed -i 's/foo/bar/g' *(.)

관련 정보