Eu tenho um código fonte espalhado por vários arquivos.
- Tem um padrão
abcdef
que eu preciso substituirpqrstuvxyz
. - O padrão pode ser
Abcdef
(Caso de sentença) e, em seguida, precisa ser substituído porPqrstuvxyz
. - O padrão pode ser
AbCdEf
(alternar entre maiúsculas e minúsculas) e, em seguida, precisar ser substituído porPqRsTuVxYz
.
Em resumo, preciso corresponder ao caso do padrão de origem e aplicar o padrão de destino apropriado.
Como posso conseguir isso usando sed
ou qualquer outra ferramenta?
text-processing
sed
awk
user1263746
fonte
fonte
ABcDeF
?ABcDeF
->PQrStUvxyz
então certamenteAbCdEf
->PqRsTuvxyz
seria logicamente consistente. Se o caso for copiado de uma sequência para outra, o que acontecerá se a segunda sequência de substituição for maior.Respostas:
Solução portátil usando
sed
:É um pouco mais fácil com o GNU sed:
Ao usar
&&&
acima, reutilizamos o padrão de maiúsculas e minúsculas da string para o restante da substituição. Portanto,ABcdef
seria alterado paraPQrstuVWx
eAbCdEf
paraPqRsTuVwX
. Altere para&
para afetar apenas o caso dos 6 primeiros caracteres.(note que não pode fazer o que quiser, ou pode executar em um ciclo infinito se a substituição pode ser objecto de substituição (por exemplo, se substituindo
foo
porfoo
, oubcd
paraabcd
)fonte
Solução portátil usando
awk
:Exemplo de entrada:
Exemplo de saída:
Atualizar
Como apontado nos comentários, o item acima substituirá apenas a primeira instância de
find
em cada linha. Para substituir todas as instâncias:Exemplo de entrada:
Exemplo de saída:
fonte
Você poderia usar
perl
. Diretamente do faq - citandoperldoc perlfaq6
:Como substituo maiúsculas e minúsculas no LHS enquanto preservo o caso no RHS?
Aqui está uma adorável solução Perlish de Larry Rosler. Ele explora propriedades do bit a bit xor em cadeias ASCII.
E aqui está como uma sub-rotina, modelada a seguir:
Isso imprime:
Como alternativa, para manter o caso da palavra de substituição, se ela for maior que a original, você pode usar este código, por Jeff Pinyan:
Isso altera a sentença para "este é um caso de sucesso".
Apenas para mostrar que os programadores C podem escrever C em qualquer linguagem de programação, se você preferir uma solução mais semelhante ao C, o script a seguir faz com que a substituição tenha o mesmo caso, letra por letra, que o original. (Também acontece que é executado cerca de 240% mais lento que a solução Perlish.) Se a substituição tiver mais caracteres do que a sequência que está sendo substituída, o caso do último caractere será usado para o restante da substituição.
fonte
Se você aparar a substituição para
pqrstu
, tente o seguinte:Entrada:
Ouput:
Se você deseja substituir por
prstuvxyz
, pode ser o seguinte:Não consigo encontrar nenhuma regra para mapear
ABcDeF
->PQrStUvxyz
.fonte
Algo assim faria o que você descreveu.
fonte