파일을 입력으로 사용하여 bash 스크립트에서 sed를 사용하려고 합니다. 명령줄에서 동일한 명령을 실행하면 작동합니다. 하지만 해당 파일을 sed 명령 스크립트의 입력으로 사용하면 다음과 같은 결과가 나타납니다.
sed: can't read : No such file or directory
명령줄에서:
sed -i 's/.*abd.*/xyz/ input.txt
여러 sed 명령을 사용하여 스크립트로 만들고 파일을 입력으로 전달하면 작동하지 않습니다.
내가 시도한 스크립트 중 (아무도 작동하지 않았습니다)
sed -i 's/.*abd.*/xyz/' < "$1"
sed -i 's/.*abd.*/xyz/' < '$1'
sed -i 's/.*abd.*/xyz/' $1
스크립트
./sed_script.sh input.txt
답변1
오류를 재현하려면 이름 길이가 0인 파일을 사용해야 합니다.
$ sed -i 's/.*abd.*/xyz/' ""
sed: can't read : No such file or directory
이 명령이 스크립트의 일부라고 말씀하셨기 때문에 믿게 되었습니다.
스크립트에 오류가 있으며 호출할 때 사용된 변수 이름에 철자 오류가 포함되어 있습니다
sed
.filename=$1 sed -i 's/.*abd.*/xyz/' "$fliname" # should have been "$filename"
또는
for i in something; do sed -i 's/.*abd.*/xyz/' "$1" # should have been "$i" done
올바른 옵션이나 파일 이름 매개변수를 제공하지 않는 등 스크립트를 잘못 사용하고 있을 수 있습니다.
시도한 수정 사항 중 어느 것도 정확하지 않습니다. 을(를 ) 사용하고 계시므로 sed -i
,할 수 없다표준 입력에서 읽고 이름이 $1
.
마지막 변종,
sed -i 's/.*abd.*/xyz/' $1
대부분은 정확하지만 $1
인용 해야 합니다 "$1"
. 그렇지 않으면 이름에 공백이나 와일드카드 패턴 등이 포함된 파일 이름을 제대로 처리하지 못할 수 있습니다.
스크립트에서 이러한 명령 변형을 시도할 때 어떤 일이 발생하는지, 스크립트의 잘못된 명령이 실제로 어떻게 보이는지(또는 스크립트의 나머지 부분이 실제로 무엇을 하는지) 언급하지 않은 것은 매우 불행한 일입니다. 이렇게 하면 문제 디버깅이 더 쉬워집니다.
위의 명령(주위에 큰따옴표를 추가하여 수정됨)은 $1
스크립트에서 $1
호출될 때 무엇을 기대할 수 있는지 알 수 없기 때문에 작동이 보장되지 않습니다.sed
답변2
다음 명령을 시도해 보십시오. 작동할 것입니다. ( sed -i 's/.*abd.*/xyz/' $1
모드가 올바른지 확인하십시오.) i를 사용하면 파일 내에서 자동으로 대체됩니다.
달리기 - sed -i 's/.*abd.*/xyz/' input.txt
답변3
텍스트 파일의 패턴을 바꾸려고 하시는 것 같습니다 abd
. xyz
NetBSD에서 다음을 시도했는데 작동했습니다.
#!/bin/bash
sed 's/.*abd.*/xyz/' $1
결과는 다음과 같습니다.
$ cat input.txt
one.abd.
two.abd.
abd
three
four
$ ./test.sh input.txt
xyz
xyz
xyz
three
four
스크립트에서 -i
및를 제거하면 <
제대로 작동합니다. 아니면 성공적으로 시도했거나
#!/bin/bash
input=$1
sed 's/.*abd.*/xyz/' $input