2つの文字列の間のスペースを削除しようとしていますが、
312.2 MB
123.34 KB
487.1 GB
私はそれらを次のように変更したいと思います:
312.2MB
123.34KB
487.1GB
頑張ってきて、次のことができます。
echo "312.2 MB" | sed s/[0-9][[:space:]][GMK]//g
312.B
しかし、次のように逆参照を作成しようとするとsed
:
echo "312.2 MB" | sed s/\([0-9]\)[[:space:]]\([GMK]\)/\1/g
312.2 MB
私の考えでは、一致が1つだけあり、逆参照が完全な一致であるようです。しかし、次のようになります。
echo "312.2 MB" | sed s/\([0-9]\)[[:space:]]\([GMK]\)/TRY/g
312.2 MB
()
だから私が次を使ってキャラクターをキャプチャするとき
正規表現は完全に正確ではないかもしれませんが、その理由はわかりません。
答え1
問題は参照にあります。
コマンドを引用しなかったため、sed
角かっこは\(...\)
に渡される前にシェルによって解釈されますsed
。
したがって、sed
エスケープされた角かっこではなくリテラル角括弧として扱われ、逆参照には影響しません。
以下を行う必要があります。
echo "312.2 MB" | sed 's/\([0-9]\)[[:space:]]\([GMK]\)/\1\2/g'
逆参照に影響を与え、必要なものを入手してください。
またはより簡単に:
echo "312.2 MB" | sed 's/ //'
答え2
あなたはあなたの表現を引用しませんでしたsed
。それが犯人です。たとえば、引用符を使用すると、sed ' '
単にtr
次のような表現で取得できます。
tr -d '[:space:]' <<< "312.2 MB"
312.2MB
tr -d ' ' <<< "123.34 KB"
123.34KB
tr -d '[:blank:]' <<< "487.1 GB"
487.1GB
こだわるとsed
こうすることができる。
sed 's/ //g'
sed 's/[[:blank:]]//g'
sed 's/[[:space:]]//g'
答え3
使用bash
:
$ txt="32.2 MB"
$ echo ${txt// /}
32.2MB