Eu respondi a esta pergunta , mas estou preso na parte em que também tenho que adicionar uma aspa simples.
Como o arquivo original é:
$$BATCHCTRL=TEST-012017
$$STATE=CA AZ
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
O novo arquivo deve ser:
$$BATCHCTRL=TEST-012017
$$STATE='CA'
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
eu usei
sed -Ei 's/^\$\$STATE=([A-Z]{2}) ([A-Z]{2})/\$\$STATE=\1/g' sed_file
Então eu consegui:
$$BATCHCTRL=TEST-012017
$$STATE=CA
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
mas agora não consigo adicionar aspas simples nele. Eu tentei escapar, usei aspas duplas em vez de aspas simples, tentei sem aspas, mas nenhuma está funcionando.
Duas opções:
Interrompa temporariamente a string entre aspas simples que é a
sed
expressão, insira"'"
(um caractere de aspas simples entre aspas) e continue. Repita para a outra citação.Observe que
$
não precisa ser escapado na string de substituição.Você também pode usar
\'
no lugar de"'"
:ou,
Use aspas duplas ao redor da expressão e aspas simples como caracteres comuns. Isso requer que todas as barras invertidas e
$
caracteres existentes sejam protegidos do shell.O escape excessivo aqui é necessário porque você deseja
sed
obter a string literal\$
na expressão regular (e apenas$
na parte de substituição). Entre aspas duplas no shell,\$
é apenas um literal$
.\\$
seria uma barra invertida literal seguida de$
, e o shell tentaria usar o que estiver depois de$
como algo para expandir ($$
ou$STATE
por exemplo). Usando\\\$
, damos uma barra invertida literal seguida por uma literal$
.Eu também removi o
g
no final dased
expressão. Como você está ancorando-o no início da linha, não esperamos que a substituição seja realizada mais de uma vez.FWIW, você pode usar o seguinte para substituir plus slip entre aspas simples de uma invocação de linha de
bash
comandosed
, conforme mostrado:Desta forma, você é salvo da "barra invertida excessiva", conhecida por causar 'barra invertida'.
Alguns pontos para reflexão:
A
$
perde seu status de metacaractere quando usado em qualquer lugar, exceto o último, no lhs do comando s///. Ofc, você deve estar entre aspas simples de qualquer maneira, o bash será ativado e expandirá vars. Estou falando do que o sed faz.No rhs do comando s///, o $ não é um metacaractere, então não há necessidade de escapar dele.
Sed deve estar no modo -e e não no modo -re.
HTH
Eu tentei com o método abaixo
resultado