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

テキストファイルのパターンを変更しようとしているようですabdxyzNetBSDで次のことを試しましたが、うまくいきました。

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

関連情報