sedはshファイルでは機能しませんが、コマンドラインでは機能します。

sedはshファイルでは機能しませんが、コマンドラインでは機能します。

sedshコマンドラインでは機能しますが、ファイルに入れて実行すると機能しません。既存のファイルの番号を変更して新しいファイルに渡したいので、次のことを試しました。

echo enter number 
read num
var1='more ods2.sql | egrep -e "test" | cut -c 5-7' 
sed "s/test$var1/test$num/g" ods2.sql > odstest.sql

プロンプトでこれらの文を実行すると、目的の結果が得られます。$var1渡した文字列に置き換えます。たとえば、次のようになります12345

sed "s/test$var1/test$num/g" ods2.sql > odstest.sql

プロンプトでは、これもうまく機能します。

more ods2.sql | egrep -e "test" | cut -c 5-7'

シェルスクリプトに入れるとなぜ動作しませんか?

答え1

この行

var1='more ods2.sql | egrep -e "test" | cut -c 5-7'

しなければならない

var1=`more ods2.sql | egrep -e "test" | cut -c 5-7`

つまり、一重引用符(アポストロフィ)の代わりにバックティックを使用する必要があります。

答え2

more端末で動作するように設計されています。より簡単な方法は

var1=$(< ods2.sql grep "test" | cut -c 5-7)
sed "s/test$var1/test$num/g" ods2.sql > odstest.sql

Picky:しかし、最初の行は注意してください。 ods2.sqlで抽出したいテキストの位置と長さを想定しています。var1どのように見えるかわかりませんが、数字であると仮定する例は次のとおりです。

var1=$(< ods2.sql sed -n 's/test\([:digit:]*\)/\1/p')
if ! [ -n "$var1" ]  # sed didn't find the pattern
    # complain, exit
fi

関連情報