web-dev-qa-db-ja.com

sedを使用して文字列内の最後の文字を置き換えるにはどうすればよいですか?

sedを使用して、文字列内の最後の「-」のみをスペースに置き換えるにはどうすればよいですか?

例えば:

echo $MASTER_DISK_RELEASE
swp-RedHat-Linux-OS-5.5.0.0-03

しかし、次の出力を取得したい(最後のハイフン[“-“]をスペースに置き換えて)

swp-RedHat-Linux-OS-5.5.0.0 03
32
maihabunash

単一のsedでそれを行うことができます:

sed 's/\(.*\)-/\1 /'

または、拡張正規表現を使用します。

sed -r 's/(.*)-/\1 /'

ポイントは、sedは非常に貪欲であるため、他の-を含め、-の前のできるだけ多くの文字に一致することです。

$ echo 'swp-RedHat-Linux-OS-5.5.0.0-03' | sed 's/\(.*\)-/\1 /'
swp-RedHat-Linux-OS-5.5.0.0 03
49
jimmij

bashパラメータ展開 でもこれを処理できます。

s=swp-RedHat-Linux-OS-5.5.0.0-03
echo ${s%-*} ${s##*-}

出力:

swp-RedHat-Linux-OS-5.5.0.0 03
28
Thor

このようなものがうまくいきましたが、もっと良い方法があると確信しています

echo "swp-RedHat-Linux-OS-5.5.0.0-03" | rev | sed 's/-/ /' | rev
swp-RedHat-Linux-OS-5.5.0.0 03
11
rahul