web-dev-qa-db-ja.com

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
hithesh

エラーを再現するには、長さがゼロのファイルを使用する必要があります。

$ 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

0
Kusalananda

テキストファイルのパターンabdxyzに置き換えようとしていると思います。私は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
0
am401

このコマンドで動作するはずのコマンドを試してください:sed -i 's/.*abd.*/xyz/' $1(パターンが正しいことを確認してください)iを使用すると、ファイル内で自動的に置き換えられます。

実行-sed -i 's/.*abd.*/xyz/' input.txt

0
user366444