逆参照でsedを使用する

逆参照でsedを使用する

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

関連情報