2

たとえば、次のように、スペースで区切られた 4 つの数値を含む変数があります。

a="12.3 423.4 11.0033 14.02"

しかし、時々、末尾に空白があります:

a="12.3 423.4 11.0033 14.02 "

スペースを「 & 」に置き換えたいので、次のようにします。

echo ${a// / & }

それは私に与えます:

12.3 & 423.4 & 11.0033 & 14.02

または、末尾に空白がある場合:

12.3 & 423.4 & 11.0033 & 14.02 & 

私の問題は、文字列の最後にスペースがあるかどうかわからないことであり、いずれにせよ余分な「&」は必要ありません。この余分な文字を避ける最もエレガントな方法は何でしょうか? 「スペースと次の文字が数字の場合に置き換える」と言う方法はありますか?

編集: sedを使用できることは知っていましたが、bashには変数置換のメカニズムがあるため、それを使用して必要なことを行う方法を知りたいです。bash置換で「行末ではない」や「数字です」の書き方がわかりません。

4

5 に答える 5

8

これにより、末尾のスペースがあれば削除されます。

a=${a% }

次に、置換を行うことができます:

a=${a// / & }
于 2013-09-27T13:55:17.527 に答える
1

sed を使用して、一致をキャプチャできます。

$ echo 12.3 423.4 11.0033 14.02 | sed 's/ [0-9]/ \&&/g'
12.3 & 423.4 & 11.0033 & 14.02

したがって、 では/ [0-9]/、スペースの後に数字が続く場所のみを置き換えます。

sed を使用したくない場合は、次の文字が EOL でないことを確認できます。

${a// [^$]/ & }
于 2013-09-27T13:50:12.933 に答える
1
shopt -s extglob            # enable extended globbing patterns
b=${a/%+([[:blank:]])/}     # remove trailing whitespace
b=${b/#+([[:blank:]])/}     # remove leading whitespace
b=${b//+([[:blank:]])/ & }  # globally replace whitespace by " & "
echo ">$a<"
echo ">$b<"
>12.3 423.4 11.0033 14.02 <
>12.3 & 423.4 & 11.0033 & 14.02<

参照:

http://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion

于 2013-09-27T14:24:25.607 に答える
1

これはおそらく不自然なアプローチですが、FWIW. 複数の連続するスペースが単一の に置き換えられても問題&ない場合は、bashreadprintfビルトインを使用して文字列を配列に分割し (IFS分割用のデフォルトの空白を想定)、一時的な を使用して結合し直すIFSことができ&ます。以下を参照してください。

a="12.3 423.4 11.0033 14.02 "
read -r -a x <<< "${a}"
IFS='&' eval 'printf -v a "%s" "${x[*]}"'
echo $a
12.3&423.4&11.0033&14.02
于 2013-09-27T14:31:15.087 に答える
0

多分あなたはただすることができます

a=`echo "12.3 423.4 11.0033 14.02 " | sed 's/ *$//'`
echo ${a// / & }

そうすれば、末尾の空白を削除できます。

于 2013-09-27T13:44:43.383 に答える