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
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
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"
substitua o primeiro "dois"
$ echo ${s/two/X}
_one_X_one_two
substituir todos "dois"
$ echo ${s//two/X}
_one_X_one_X
substitua "dois" se estiver ancorado no final da string
$ echo ${s/%two/X}
_one_two_one_X
substitua "um" se ele estiver ancorado no início da string (não é, nenhum substituto)
$ echo ${s/#one/X}
_one_two_one_two
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_
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