Como posso substituir um caractere específico em uma string, por um caractere específico de outra string?

4

Por exemplo: eu tenho string1 = 'abcd' e string2 = 'xwyz' .

Eu quero substituir o terceiro caractere de string1 ('c') pelo quarto caractere de string2 ('z').

Claro, a indexação de strings começa em 0.

Como posso conseguir isso?

    
por user241594 20.07.2017 / 09:41

2 respostas

11

Com manipulação de substring bash :

s1="abcd"
s2="xwyz"
s1=${s1:0:2}${s2:3}${s1:3}
  • ${s1:0:2} - a primeira fatia contendo ab (até o terceiro caractere c )

  • ${s2:3} - o quarto caractere da string s2 a ser inserida

  • ${s1:3} - o último (4º) caractere da string s1

Valor final s1 :

echo $s1
abzd

Ou com a ferramenta GNU awk :

gawk -v s2=$s2 -v FPAT='[a-z]' '{$3=substr(s2,4)}1' OFS="" <<< $s1
abzd
  • <<< $s1 - a primeira string s1 é considerada como conteúdo de entrada

  • -v s2=$s2 - passando a segunda string s2 como variável para o script awk

  • FPAT='[a-z]' - padrão regex que define um valor de campo ( [a-z] - qualquer caractere alfabético)

Como alternativa, você também pode aplicar o separador de campo "vazio" FS="" , tratando cada caractere como um campo separado:

gawk -v s2=$s2 'BEGIN{ FS=OFS="" }{$3=substr(s2,4)}1' <<< $s1
abzd
    
por 20.07.2017 / 10:10
3

Aqui está o código awk (longo e complicado, mas funciona para mim)

echo |awk -v a="$string1" -v b="$string2" '{split(a,a1,""); n=split(b,b1,"");a1[2]=b1[3];for (i=1;i<=n;i++) {printf a1[i]}}'
    
por 20.07.2017 / 10:13