SASファイル内でパターンを個別に変更するのではなく、sedを使用してパターンを検索および置換しています。問題は、マクロ変数を置換しようとしているため、アンパサンドを使用すると処理されないことです正しく。
Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas
このコマンドを実行するたびに、元のテキストにあらゆる種類のファンキーなものが追加されて実行されるようです。
質問:アンパサンドを含むテキストをsedコマンドで置き換えるにはどうすればよいですか?
&
は置換テキストで特別です。「パターンに一致した入力の全体」を意味するため、ここで実行していることはuser=&uidX
をuser=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'
つまり、「u
をsysuser
でuser=&
とid.
の間で置き換えます」。