$ strという文字列があるとします。 $ strを編集して、その中のすべてのスペースをアンダースコアに置き換えるようにします。
例
a="hello world"
私はの最終出力が欲しい
echo "$a"
になるhello_world
以下を試すことができます:
str="${str// /_}"
$ a="hello world"
$ echo ${a// /_}
hello_world
Bash(1)によれば:
${parameter/pattern/string}
パターン置換。パス名展開と同様に、パターンが展開されてパターンが生成されます。パラメータが拡張され、その値に対するパターンの最長一致が文字列に置き換えられます。パターンが/で始まる場合、パターンのすべての一致が置き換えられます
文字列付き。通常、最初に一致したものだけが置き換えられます。パターンが#で始まる場合、パラメーターの展開された値の先頭で一致する必要があります。パターンが%で始まる場合、パラメーターの展開された値の最後で一致する必要があります。 stringがnullの場合、パターンの一致は削除され、/に続くパターンは省略できます。パラメーターが@または*の場合、置換操作は各位置パラメーターに順番に適用され、展開が結果のリストになります。 parameterが@または*が添え字付きの配列変数である場合、置換演算は配列の各メンバーに順番に適用され、展開が結果のリストになります。
純粋なbash:
a="hello world"
echo "${a// /_}"
またはtr:
tr -s ' ' '_' <<< "$a"
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
_