2

ファイル内のいくつかの単語を見つけて置き換え、そのファイルを .sql ファイルとして実行しようとしています

sed -e "s/wordToFind1/UnixFile/g" Check.sql;
sed -e "s/wordToFind2/WordToReplace2/g" Check.sql;

上記では、wordToFind1 を見つけて UnixFile に置き換えようとしています: /usr/bin/try.txt そして、wordToFind2 を見つけて別の単語に置き換えようとしています: tablename

sed の前- Check.sql :

servermonitor on
spool wordToFind1
select * from wordToFind2

sed の後- Check.sql :

servermonitor on
spool /usr/bin/try.txt
select * from tablename

上記の変更が完了したら、SQL ファイルを実行しようとしています。助けてください!!!

4

2 に答える 2

4

ここで解決すべき問題がいくつかあります。

/内部でスラッシュ ( ) を使用するs///

まず、 に置き換えwordToFind1ます/usr/bin/try.txts///置換文字列に が含まれているため、最初はコマンドで機能しません/。それは非常に奇妙なコマンドになります!

sed -e 's/wordToFind1//usr/bin/try.txt/' Check.sql

Sed は、コマンドs/wordToFind1//にいくつかのフラグ ( などu) があり、他のコマンドが続くと見なしますが、意味がなく、エラーが生成されます。/解決策は、 each from /usr/bin/try.txtwithをエスケープすることです\:

$ sed -e 's/wordToFind1/\/usr\/bin\/try.txt/' Check.sql
servermonitor on
spool /usr/bin/try.txt
select * from wordToFind2

ただし、これは不器用です。/置換文字列 (または置換文字列) に多くの文字列がある場合、IMHO のより良い解決策は、別の文字を の区切り記号として使用することですs///。誰もがそれが可能であることを知っているわけではありませんが/s///. この場合、/式をエスケープする必要なく、式の中で好きなだけ使用できます。以下の例では、#代わりにを使用し/ているため、 からのスラッシュは/usr/bin/try.txt問題ありません。

$ sed -e 's#wordToFind1#/usr/bin/try.txt#' Check.sql
servermonitor on
spool /usr/bin/try.txt
select * from wordToFind2

複数のs///コマンドを使用する

それを解決し、あなたも交換する必要がありwordToFind2ます。これは簡単です。-e同じ sed 呼び出しで別のコマンドを渡すだけです。

$ sed -e 's#wordToFind1#/usr/bin/try.txt#' -e 's/wordToFind2/tablename/' Check.sql
servermonitor on
spool /usr/bin/try.txt
select * from tablename

(別のオプションは、セミコロンで区切られた 1 つの文字列のみに複数のオプションを追加することです。

$ sed -e 's#wordToFind1#/usr/bin/try.txt#;s/wordToFind2/tablename/' Check.sql
servermonitor on
spool /usr/bin/try.txt
select * from tablename

より大きなsedスクリプトを使用すると、非常に役立つ場合がありますが、読みにくくなります)。

入力ファイルを更新する-i

ここで、ファイルを更新する必要がありCheck.sqlます。-iこれも簡単です。フラグを sedに渡すだけです。このフラグにより​​、sed は元のファイルを更新します。また、このフラグはパラメーターを受け取ることができます。これは、元のコンテンツを含むバックアップ ファイルに追加される拡張子です。この場合、.bkp拡張子を使用します。結果を見る:

$ sed -i.bkp -e 's#wordToFind1#/usr/bin/try.txt#' -e 's/wordToFind2/tablename/' Check.sql
$ cat Check.sql
servermonitor on
spool /usr/bin/try.txt
select * from tablename

さて、Check.sql変わりました。また、Check.sql.bkp古い内容のがあります。

$ cat Check.sql.bkp 
servermonitor on
spool wordToFind1
select * from wordToFind2

これは、何か問題が発生した場合に役立ちます。

于 2012-06-15T15:17:06.637 に答える
0

私はsedで何かを得ることができません。だから私はawkを使いました。Replace1 と Replace2 を引数としてシェル スクリプトに渡し、適切な値で ip.sql を作成します。

#!/bin/bash
awk -v R1=$1 -v R2=$2 '{gsub("wordToFind1",R1);gsub("wordToFind2",R2);print}' ip.sql > t.sql;
mv t.sql ip.sql;
于 2012-06-15T04:45:50.947 に答える