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