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


19

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

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

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

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


6
&それはRHSで使用する場合にエスケープする必要がありますので、特殊文字がある-あなたのケースでは、あなたが実行する必要があり 's/user=&uid./user=\&sysuserid./g'、私はあなたが実際に必要とするので、あなたはまた、リテラルのドットを一致させるためにLHSのドットをエスケープする必要がある疑いがあるものの's/user=&uid\./user=\&sysuserid./g'
don_crissti

1
はい、右側の「&」は基本的に「左側で一致したすべて」を意味するため、「\」でエスケープします。単なるコメントではなく、答えにするべきです。
エドワードフォーク

私は他の誰でアップだけで頭が好奇心:)だった...最初の期間をエスケープする必要がdidntは
lucasdavis500

回答:


25

&置換テキストでは特別です。「パターンに一致した入力の全体」を意味するため、ここで行うことはに置き換え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ことにより、sysuseruser=&およびid.」。


グループを説明してもらえますか?
lucasdavis500

2
@ lucasdavis500グループは、パターンの一部を識別します。バックスラッシュと括弧で区切られています。たとえば、一致文字列をグループとして\(user=&\)照合user&して保存するパターンです(パターン内の最初のグループなのでグループ番号1)。そして、交換に\1グループ番号1のために格納されている文字列に置き換えられます
ジル「SO-停止されて悪」

(user =&)はuser&ではなくuser =&を保存するということですか?
lucasdavis500

@ lucasdavis500コメントがわかりません。文字=正規表現でと置換テキストでは、自身の略で、これuser=&だけ一致しuser=&、かつuser=&置換テキストの収率でuser=正規表現にマッチした行の一部が続きます。
ジル 'SO-悪であるのをやめる'

1
@ lucasdavis500 =キャラクターには特別な意味はありません。user=&置換テキストではuser=、元の一致したテキストが続きます。user=\&置換テキスト生成中user=&
ジル「SO-停止されて悪」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.