
ファイルを入力として使用して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