通过BASH用下划线替换空格

Ayu*_*hra 10 unix linux bash shell terminal

假设我有一个字符串$ str.我想要编辑$ str,使其中的所有空格都被下划线替换.

a="hello world"
Run Code Online (Sandbox Code Playgroud)

我想要最终的输出

echo "$a"
Run Code Online (Sandbox Code Playgroud)

hello_world

Wil*_*Hay 24

您可以尝试以下方法:

str="${str// /_}"
Run Code Online (Sandbox Code Playgroud)


fed*_*qui 11

sed直接从变量读取:

$ sed 's/ /_/g' <<< "$a"
hello_world
Run Code Online (Sandbox Code Playgroud)

要存储结果,您必须使用var=$(command)以下语法:

a=$(sed 's/ /_/g' <<< "$a")
Run Code Online (Sandbox Code Playgroud)

为了完整起见,awk可以这样做:

$ a="hello my name is"
$ awk 'BEGIN{OFS="_"} {for (i=1; i<NF; i++) printf "%s%s",$i,OFS; printf "%s\n", $NF}' <<< "$a"
hello_my_name_is
Run Code Online (Sandbox Code Playgroud)


fal*_*tru 9

$ a="hello world"
$ echo ${a// /_}
hello_world
Run Code Online (Sandbox Code Playgroud)

根据bash(1):

${parameter/pattern/string}
Run Code Online (Sandbox Code Playgroud)

模式替换.扩展模式以生成模式,就像在路径名扩展中一样.扩展参数,并将模式与其值的最长匹配替换为字符串.如果pattern以/开头,则替换所有模式匹配
用字符串.通常只替换第一场比赛.如果pattern以#开头,则它必须在参数的扩展值的开头匹配.如果pattern以%开头,则它必须在参数的扩展值的末尾匹配.如果string为null,则删除pattern的匹配,并且可以省略/ following模式.如果参数是@或*,则替换操作依次应用于每个位置参数,并且扩展是结果列表.如果parameter是使用@或*下标的数组变量,则替换操作依次应用于数组的每个成员,并且扩展是结果列表.

  • 提高这个参考 bash 的文档,在其他答案中缺失。 (4认同)

anu*_*ava 9

纯粹的bash:

a="hello world"
echo "${a// /_}"
Run Code Online (Sandbox Code Playgroud)

或者tr:

tr -s ' ' '_' <<< "$a"
Run Code Online (Sandbox Code Playgroud)

  • +1 表示纯粹的 bash 语法!想知道它在幕后做什么。看起来它正在执行“sed”替换操作。有任何 bash 手册说明使用这种语法吗? (2认同)

Ser*_*ndt 9

多个空格改为一个下划线

这可以通过GNU shell 参数扩展轻松实现。尤其:

${parameter/pattern/string}

如果模式以 开头/,则模式的所有匹配项都将替换为字符串。

+(pattern-list)

匹配给定模式的一次或多次出现。

因此:

$ a='hello world    example'

$ echo ${a// /_}
hello_world____example

$ echo ${a//+( )/_}
hello_world_example
Run Code Online (Sandbox Code Playgroud)

然而,要使其在 bash 脚本中工作,需要进行两项修改:

  1. 参数扩展需要用双引号封装," "以防止输入字段分隔符进行分词 $IFS
  2. 需要使用内置extglob选项启用 shell 选项,以便识别扩展模式匹配运算符。shopt

bash 脚本最终如下所示:

$ a='hello world    example'

$ echo ${a// /_}
hello_world____example

$ echo ${a//+( )/_}
hello_world_example
Run Code Online (Sandbox Code Playgroud)