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

おすすめ記事