【发布时间】:2013-11-08 18:54:30
【问题描述】:
假设我有一个字符串 $str。 我希望编辑 $str 以便将其中的所有空格都替换为下划线。
例子
a="hello world"
我想要
的最终输出echo "$a"
成为hello_world
【问题讨论】:
标签: linux bash shell unix terminal
假设我有一个字符串 $str。 我希望编辑 $str 以便将其中的所有空格都替换为下划线。
例子
a="hello world"
我想要
的最终输出echo "$a"
成为hello_world
【问题讨论】:
标签: linux bash shell unix terminal
使用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
【讨论】:
sed .../g,默认情况下只使用一次。
$ a="hello world"
$ echo ${a// /_}
hello_world
根据 bash(1):
${parameter/pattern/string}模式替换。将图案展开以产生图案 就像在路径名扩展中一样。参数被扩展并且 模式与其值的最长匹配被替换为字符串。 如果 pattern 以 / 开头,则替换所有匹配的 pattern
用字符串。通常只替换第一场比赛。如果 模式以 # 开头,必须匹配 参数的扩展值。如果模式以 % 开头,它必须匹配 在参数扩展值的末尾。如果字符串为空, 模式的匹配被删除并且 / 以下模式可能是 省略。如果参数为@或*,则替换操作为 依次应用于每个位置参数,展开是 结果列表。如果参数是下标的数组变量 使用 @ 或 *,替换操作适用于每个成员 数组依次展开,展开就是结果列表。
【讨论】:
纯 bash:
a="hello world"
echo "${a// /_}"
或 tr:
tr -s ' ' '_' <<< "$a"
【讨论】:
falsetru 已经为此Pattern substitution 添加了相关的man 部分
您可以尝试以下方法:
str="${str// /_}"
【讨论】:
这可以通过GNU shell parameter expansion 轻松实现。特别是:
${parameter/pattern/string}
如果pattern以
/开头,所有匹配的pattern都会被替换为字符串。
+(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//+( )/_}"
【讨论】: