通过BASH用下划线替换空格

时间:2013-10-29 14:39:21

标签: linux bash shell unix terminal

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

实施例

a="hello world"

我想要

的最终输出
echo "$a"

hello_world

5 个答案:

答案 0 :(得分:23)

您可以尝试以下方法:

str="${str// /_}"

答案 1 :(得分:9)

$ a="hello world"
$ echo ${a// /_}
hello_world

根据bash(1):

${parameter/pattern/string}
     

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

答案 2 :(得分:9)

Pure bash:

a="hello world"
echo "${a// /_}"

OR tr:

tr -s ' ' '_' <<< "$a"

答案 3 :(得分:4)

直接从变量中读取sed

$ sed 's/ /_/g' <<< "$a"
hello_world

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

a=$(sed 's/ /_/g' <<< "$a")

为了完整起见,使用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

答案 4 :(得分:0)

多个空格;一个下划线

这可以通过 GNU shell parameter expansion 轻松实现。特别是:

${parameter/pattern/string}

<块引用>

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

带有+(pattern-list)

<块引用>

匹配一个或多个给定模式。

因此:

$ a='hello world    example'

$ echo ${a// /_}
hello_world____example

$ echo ${a//+( )/_}
hello_world_example

但是,for this to work in a bash script 需要做两处修改:

  1. 参数扩展需要用双引号 " "prevent word splittinginput field separator $IFS 进行封装。
  2. 需要使用 shopt builtin 启用 extglob shell 选项,以便识别扩展模式匹配运算符。

bash 脚本最终看起来像这样:

# !/usr/bin/env bash
shopt -s extglob
a='hello world    example'
echo "${a//+( )/_}"