web-dev-qa-db-ja.com

アンパサンド(&)を使用したsedの使用

SASファイル内でパターンを個別に変更するのではなく、sedを使用してパターンを検索および置換しています。問題は、マクロ変数を置換しようとしているため、アンパサンドを使用すると処理されないことです正しく。

Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas

このコマンドを実行するたびに、元のテキストにあらゆる種類のファンキーなものが追加されて実行されるようです。

質問:アンパサンドを含むテキストをsedコマンドで置き換えるにはどうすればよいですか?

21
lucasdavis500

&は置換テキストで特別です。「パターンに一致した入力の全体」を意味するため、ここで実行していることはuser=&uidXuser=user=&uidXsysuserid.に置き換えます。置換テキストに実際のアンパサンドを挿入するには、\&を使用します。

間違っているように見えるもう1つのことは、検索パターンの.が任意の文字(改行を除く)を表すことですが、置換テキストの最後の.はリテラルドットです。リテラル文字列user=&uid.のみを置き換える場合は、.をバックスラッシュで保護します。

sed -e 's/user=&uid\./user=\&sysuserid./g'

1つの文字を置き換えて結果に保持したい場合は、文字をグループに入れ、置換で\1を使用してそのグループを参照します。

sed -e 's/user=&uid\(.\)/user=\&sysuserid\1/g'

実際、元のテキストと置換の繰り返しを考えると、とにかくグループを使用する必要があります。

sed -e 's/\(user=&\)u\(id\.\)/\1sysuser\2/g'

つまり、「usysuseruser=&id.の間で置き換えます」。