web-dev-qa-db-ja.com

BASHを使用してスペースをアンダースコアに置き換えます

$ strという文字列があるとします。 $ strを編集して、その中のすべてのスペースをアンダースコアに置き換えるようにします。

a="hello world"

私はの最終出力が欲しい

echo "$a"

になるhello_world

12
Ayush Mishra

以下を試すことができます:

str="${str// /_}"
24
William Hay
$ a="hello world"
$ echo ${a// /_}
hello_world

Bash(1)によれば:

${parameter/pattern/string}

パターン置換。パス名展開と同様に、パターンが展開されてパターンが生成されます。パラメータが拡張され、その値に対するパターンの最長一致が文字列に置き換えられます。パターンが/で始まる場合、パターンのすべての一致が置き換えられます
文字列付き。通常、最初に一致したものだけが置き換えられます。パターンが#で始まる場合、パラメーターの展開された値の先頭で一致する必要があります。パターンが%で始まる場合、パラメーターの展開された値の最後で一致する必要があります。 stringがnullの場合、パターンの一致は削除され、/に続くパターンは省略できます。パラメーターが@または*の場合、置換操作は各位置パラメーターに順番に適用され、展開が結果のリストになります。 parameterが@または*が添え字付きの配列変数である場合、置換演算は配列の各メンバーに順番に適用され、展開が結果のリストになります。

9
falsetru

純粋なbash:

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

またはtr:

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

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
fedorqui