ここで解決すべき問題がいくつかあります。
/
内部でスラッシュ ( ) を使用するs///
まず、 に置き換えwordToFind1
ます/usr/bin/try.txt
。s///
置換文字列に が含まれているため、最初はコマンドで機能しません/
。それは非常に奇妙なコマンドになります!
sed -e 's/wordToFind1//usr/bin/try.txt/' Check.sql
Sed は、コマンドs/wordToFind1//
にいくつかのフラグ ( などu
) があり、他のコマンドが続くと見なしますが、意味がなく、エラーが生成されます。/
解決策は、 each from /usr/bin/try.txt
withをエスケープすることです\
:
$ 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
これは、何か問題が発生した場合に役立ちます。