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