我有这个:
second_arg="${second_arg/[^[:alnum:]]/_}"
如果我这样做:
second_arg="foo::"
second_arg="${second_arg/[^[:alnum:]]/_}"
echo "$second_arg"
然后我得到:
foo_:
如何替换所有非字母数字实例?我尝试了这样的全局开关:
second_arg="${second_arg/[^[:alnum:]]/_/g}"
但这没有用,我最终得到了:
foo_:/g
答案1
或者,如果您想坚持使用 bash 的变量扩展功能,请使用二正斜杠将每个匹配项替换为替换项:
second_arg="${second_arg//[^[:alnum:]]/_}"
^------ here
答案2
和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_
答案3
扩展 Jeff Schaller 的答案,“搜索和替换”参数替换可以执行多种操作:
鉴于:s="_one_two_one_two"
更换第一的“二”
$ echo ${s/two/X} _one_X_one_two
代替全部“二”
$ echo ${s//two/X} _one_X_one_X
如果已锚定,则替换“二”在字符串的末尾
$ echo ${s/%two/X} _one_two_one_X
如果已锚定,则替换“一”在字符串的开头(不是,无法替代)
$ echo ${s/#one/X} _one_two_one_two
答案4
在 bash (如您所使用的)中, a${arg/one/two}
将仅替换第一次出现的on
.要将所有第一个双倍替换/
为 this ${arg/one/two}
,因此,对于您的情况:
arg=${arg//[^[:alnum:]]/_}
第二个斜杠可以更改为#
表示开始和%
表示结束。
如果字符串是:
➤ a=one_two_/one_two_one
要更改(仅)的第一个实例one
:
➤ echo ${a/one/xXx}
xXx_two_/one_two_one
第一个实例two
:
➤ echo ${a/two/xXx}
one_xXx_/one_two_one
one
参数开头的字符串:
➤ echo ${a/#one/xXx}
xXx_two_/one_two_one
one
参数末尾的字符串:
➤ echo ${a/%one/xXx}
one_two_/one_two_xXx
字符串/one
(以斜杠开头):
➤ echo ${a/\/one/xXx}
one_two_xXx_two_one
所有重复one
:
➤ echo ${a//one/xXx}
xXx_two_xXx_two_xXx