Estou usando o sed para encontrar e substituir padrões nos arquivos SAS que tenho, em vez de alterá-los individualmente. O problema é que estou tentando substituir variáveis de macro e, quando uso o e comercial, ele não está processando corretamente.
Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas
sempre que executo esse comando, ele parece acrescentar e fazer todo tipo de coisa divertida com o texto original.
Pergunta: Como substituo o texto que contém e comercial pelo comando sed?
&
é um caractere especial, portanto, ele precisa ser escapado quando usado no RHS - no seu caso, você precisa executar,'s/user=&uid./user=\&sysuserid./g'
embora eu suspeite que você também precise escapar do ponto no LHS para corresponder a um ponto literal e realmente precisar's/user=&uid\./user=\&sysuserid./g'
Respostas:
&
é especial no texto de substituição: significa “toda a parte da entrada que foi acompanhado pelo padrão”, então o que você está fazendo aqui substituiuser=&uidX
comuser=user=&uidXsysuserid.
. Para inserir um e comercial real no texto de substituição, use\&
.Outra coisa que parece errada é que,
.
no padrão de pesquisa, qualquer caractere (exceto uma nova linha), mas.
o final do texto de substituição é um ponto literal. Se você deseja substituir apenas a cadeia literaluser=&uid.
, proteja a.
barra invertida.Se você deseja substituir qualquer caractere e preservá-lo no resultado, coloque-o em um grupo e use-o
\1
na substituição para se referir a esse grupo.De fato, dada a repetição entre o texto original e a substituição, você deve usar grupos de qualquer maneira:
ou seja, "substituir
u
porsysuser
entreuser=&
eid.
".fonte
\(user=&\)
é um padrão que correspondeuser&
e armazena a sequência de correspondência como um grupo (número do grupo 1, pois é o primeiro grupo no padrão). Em seguida, a substituição\1
é substituída pela string armazenada para o grupo número 1.=
nas expressões regulares e no texto de substituição representa por si só, portanto,user=&
corresponde apenasuser=&
e,user=&
no texto de substituição, éuser=
seguido pela parte da linha correspondida pelo regex.=
personagem não tem nenhum significado especial.user=&
no texto de substituição produzuser=
seguido pelo texto correspondente original.user=\&
no texto de substituição produzuser=&