substitui todos os não alfanuméricos por sublinhado

0

Eu tenho isto:

second_arg="${second_arg/[^[:alnum:]]/_}"

se eu fizer isso:

second_arg="foo::"
second_arg="${second_arg/[^[:alnum:]]/_}"
echo "$second_arg"

então eu recebo:

foo_:

como substituo todas as instâncias de não alfanuméricos? Eu tentei uma mudança global como esta:

 second_arg="${second_arg/[^[:alnum:]]/_/g}"

mas isso não funcionou, acabei ficando:

foo_:/g
    
por Alexander Mills 05.10.2018 / 19:23

4 respostas

5

Ou, se você quiser ficar com os recursos de expansão de variável do bash, use duas barras para substituir cada correspondência com a substituição:

second_arg="${second_arg//[^[:alnum:]]/_}"
                         ^------ here
    
por 05.10.2018 / 19:50
2

Expandindo a resposta de Jeff Schaller, há várias coisas que a substituição de parâmetro "pesquisar e substituir" pode fazer:

Dado: s="_one_two_one_two"

  1. substitua o primeiro "dois"

    $ echo ${s/two/X}
    _one_X_one_two
    
  2. substituir todos "dois"

    $ echo ${s//two/X}
    _one_X_one_X
    
  3. substitua "dois" se estiver ancorado no final da string

    $ echo ${s/%two/X}
    _one_two_one_X
    
  4. substitua "um" se ele estiver ancorado no início da string (não é, nenhum substituto)

    $ echo ${s/#one/X}
    _one_two_one_two
    
por 05.10.2018 / 20:54
1

com sed :

$ echo 'This is a test; specifically it is test number 25!' | sed 's/[^a-zA-Z0-9]/_/g'
This_is_a_test__specifically_it_is_test_number_25_
    
por 05.10.2018 / 19:34
1

No bash (como você está usando), um ${arg/one/two} substituirá apenas a primeira ocorrência de on . Para substituir todos os dobro do primeiro / como este ${arg/one/two} , então, para o seu caso:

arg=${arg//[^[:alnum:]]/_}

A segunda barra pode ser alterada para # para significar início e para % para final.

Se a string for:

➤ a=one_two_/one_two_one

Para alterar a primeira instância (apenas) de one :

➤ echo ${a/one/xXx}
xXx_two_/one_two_one

A primeira instância de two :

➤ echo ${a/two/xXx}
one_xXx_/one_two_one

A string one no início do parâmetro:

➤ echo ${a/#one/xXx}
xXx_two_/one_two_one

A string one no final do parâmetro:

➤ echo ${a/%one/xXx}
one_two_/one_two_xXx

A string /one (começa com uma barra):

➤ echo ${a/\/one/xXx}
one_two_xXx_two_one

Todas as repetições de one :

➤ echo ${a//one/xXx}
xXx_two_xXx_two_xXx
    
por 06.10.2018 / 02:45

Tags