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 4
info 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' *(.)