用下划线替换所有非字母数字

用下划线替换所有非字母数字

我有这个:

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"

  1. 更换第一的“二”

    $ echo ${s/two/X}
    _one_X_one_two
    
  2. 代替全部“二”

    $ echo ${s//two/X}
    _one_X_one_X
    
  3. 如果已锚定,则替换“二”在字符串的末尾

    $ echo ${s/%two/X}
    _one_two_one_X
    
  4. 如果已锚定,则替换“一”在字符串的开头(不是,无法替代)

    $ 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

相关内容