假设我有一个字符串$ str。 我希望编辑$ str,使其中的所有空格都被下划线替换。
实施例
a="hello world"
我想要
的最终输出echo "$a"
hello_world
答案 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 需要做两处修改:
" "
到 prevent word splitting 和 input field separator $IFS
进行封装。shopt
builtin 启用 extglob
shell 选项,以便识别扩展模式匹配运算符。bash 脚本最终看起来像这样:
# !/usr/bin/env bash
shopt -s extglob
a='hello world example'
echo "${a//+( )/_}"