11

スクリプトで次の式を実行してデバイスを検索し、HTMLファイル内のデバイスに関連付けられているフィールドの1つを変更しようとしています。

sed -e "s/$OLDTEST/$TESTING/" -e "s/$CURRENTVALU/$NEWSTATUS---$DATE/" -e "s/$PASSORFAIL/$PASSORFAILNEW/" -e "s/$BGCOLOR/$BGCOLORNEW/$POSITION"  -e "s/$OLDNOTE/$NOTE/"  >> //sysadm/shared/file.tmp

「以前の正規表現はありません」と言い続けているようです。何か案は?

デバッグログ出力:

sed -e s//Yes/ -e s//Resolved---03-25-13/ -e s//Pass/ -e s//#348017/1 -e s///

sed: -e expression #5, char 0: no previous regular expression
4

1 に答える 1

14

あなたのデバッグログはあなたに全体の話をしています;-)

sed -e s//Yes/ -e s//Resolved---03-25-13/ -e s//Pass/ -e s//#348017/1 -e s///
 #------^-- empty regular expression

したがって、エラーメッセージ"no previous regular expression".

あなたの経験について明確ではないので、2つの解決策があります。UNIX / Linuxベースのシェルでは、dbl-quotes内の文字列が変数置換について評価され、コード"s/$OLDTEST/$TESTING/"が変数置換を必要とする文字列のように見えることを思い出してください。

あなたがする必要があるかもしれません

export OLDTEST="something old"
export TESTING="something new"

そのコードが機能するために。

リテラル文字列'$OLDTEST'をリテラル文字列'$TESTING'に置き換えたい場合は、シェル処理から変数を「非表示」にする必要があります。これは、unix/linuxで一重引用符を使用して行います。 。、それであなたのコマンドは

sed 's/$OLDTEST/$TESTING/
     s/$CURRENTVALU/$NEWSTATUS---$DATE/
     s/$PASSORFAIL/$PASSORFAILNEW/
     s/$BGCOLOR/$BGCOLORNEW/$POSITION
     s/$OLDNOTE/$NOTE/'  >> //sysadm/shared/file.tmp

しかし..ここに入力ファイルが表示されません。

だから本当に

sed 's/ ...../..../ ; s/../..../; etc; s/.../../' inputFile >> //sysadm/shared/file.tmp

そして、おそらく、tmp拡張子を持つもののために既存のファイルに追加したくないので、...

sed 's/ ...../..../ ; s/../..../; etc; s/.../../' inputFile > //sysadm/shared/file.tmp
#-----------------------------------------------only one > -^-------

>>sedスクリプトを強化するテストとして手段を使用し、各実行の結果を同じファイルに追加します。重複した情報がたくさんあることになります。

-eオプションを省略して、sedの省略形を使用しました。ここに示すように、Sedはcmdのグループ全体を1つの引数として処理できます。これらのコマンドをすべて別のファイルに入れて、次のように呼び出すこともできます。

   sed -f fixer.sed inputFile > //sysadmin/shared/file.tmp

そして最後に、もしあなたsedがそのオプションをサポートしているなら、あなたは-iあなたの変更を「インライン」にして、

sed -i -f fixer.sed inputFile

そして、sedは古いファイルを変更で上書きします。すべてがあなたの試みている仕事を変え、意図しない結果を引き起こさないことが確実になるまで、これに反対することをお勧めします。元のファイルがなくなると元に戻すことはできないので、実行中に.tmpに保存することは安全ベルトとして優れています:-)

IHTH

于 2013-03-25T21:11:08.103 に答える