0

以下の内容の check.txt という名前のファイルがあります。

$ cat check.txt
~/bin/tibemsadmin -server $URL-user $USER -password $PASWRD
$

$URL、$USER、$PASWRD の値がメイン スクリプトから取得されるメイン スクリプトがあります。SED ユーティリティを使用して、$URL、$USER、$PASWRD を check.txt の実際の値に置き換えたいと考えています。

私はこのようにしようとしていますが、失敗します。

emsurl=tcp://myserver:3243
emsuser=test
emspasswd=new
sed s/$URL/${emsurl}/g check.txt >> check_new.txt
sed s/$USER/${emsuser}/g check.txt_new.txt >> check_new_1.txt
sed s/PASWRD/${emspasswd}/g check_new_1.txt >> final.txt

私の final.txt 出力は以下のように望まれます:

~/bin/tibemsadmin -server tcp://myserver:3243 -user test -password new

手伝っていただけませんか?

4

4 に答える 4

3

引用符の使用には注意が必要です。また、単一のパスで複数の操作を行う方法や、パイプの使用方法についても学習する必要があります。

emsurl=tcp://myserver:3243
emsuser=test
emspasswd=new
sed -e "s%\$URL%${emsurl}%g" \
    -e "s%\$USER%${emsuser}%g" \
    -e "s%\$PASWRD%${emspasswd}%g" check.txt >final.txt

あなたの問題は、シェルがコマンドラインで「$URL」を展開したことです (おそらく何もない)。つまり、sed意図したものとは異なるものを見ることができました。$を で\エスケープすることにより、sed意図したものを確認できます。

最初/は代替操作で区切り記号として使用していたことに注意してください。ただし、DarkDustが正しく指摘しているように、URL にスラッシュがあるため、これは機能しません。私の通常の代替文字は%- 今示されているように - ですが、これは一部の URL に表示される可能性があり、適切でない場合があります。それについて心配する必要がある場合は、おそらくcontrol-Aなどの制御文字を使用するか、混乱することなくプレイできるPerlを使用します。

3 つの別々の-e式をセミコロンで置き換えて 1 つに結合することもできます。ただし、明確に分離された 3 つの操作の明快さを好みます。

于 2010-09-14T19:13:06.483 に答える
2

次のようにメイン スクリプトを変更することで、少し異なるアプローチを取ることができます。

export URL="tcp://myserver:3243"
export USER=test
export PASWRD=new
. ./check.txt

これにより、変数が設定され、メイン スクリプトのコンテキスト内で check.txt が実行されます。

于 2010-09-14T19:14:18.323 に答える
1

何が失敗しているのかはわかりませんが、問題があると思います。

これを行うことをお勧めします:

sed "s|\$URL|${emsurl}|g"

つまり、最初$は文字どおりにエスケープする必要があるためです。次に、代わりに(パイプ) を区切り文字として/使用することをお勧めします。これは、文字列では使用されないためです。|最後に"、シェルによってコンテンツが文字列として解釈されるようにするために使用します。

次に、すべてを一緒にパイプして、一時ファイルを必要としないようにすることができます。

sed "s|\$URL|${emsurl}|g" | sed "s|\$USER|${emsuser}|g" | sed "s|\$PASSWRD|${emspasswd}|g"
于 2010-09-14T19:16:34.573 に答える