Bash: 파일 입력으로 sed 작업 실행

Bash: 파일 입력으로 sed 작업 실행

파일을 입력으로 사용하여 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

이 명령이 스크립트의 일부라고 말씀하셨기 때문에 믿게 되었습니다.

  1. 스크립트에 오류가 있으며 호출할 때 사용된 변수 이름에 철자 오류가 포함되어 있습니다 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
    
  2. 올바른 옵션이나 파일 이름 매개변수를 제공하지 않는 등 스크립트를 잘못 사용하고 있을 수 있습니다.


시도한 수정 사항 중 어느 것도 정확하지 않습니다. 을(를 ) 사용하고 계시므로 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. xyzNetBSD에서 다음을 시도했는데 작동했습니다.

#!/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

관련 정보