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


31

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

例えば:

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

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

swp-RedHat-Linux-OS-5.5.0.0 03

回答:


48

あなたはsingleでそれを行うことができます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

2
これは移植性がないことに注意してください。一部の非GNUバージョンは、sedパターンマッチをサポートしていません。その場合、それperl -pne 's/(.*)-/$1 /'か、@ Thorのパラメーター拡張ソリューションか、何か他のものが必要です。
アダムカッツ

もちろん:-) thx ...
グレッグ

単一引用符を使用する場合、これらの括弧をエスケープする必要はありません。
jgmjgm

@jgmjgm拡張正規表現を使用すると、バックスラッシュを省略できますsed -r
jimmij

1
@VinayPotluri試してみてくださいsed -r 's/(.*)-(.*)-/\1 \2 /')
ジミジ


11

このような何かが私のために働いたが、もっと良い方法があると確信している

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

これは悪いです...ひどいです。2つできるのに4つの操作を行うのはなぜですか?
ジョシュバプロン

7
正規表現の基本的な理解しか持っていない人にとって、この答えははるかに親しみやすいようです。そして、それがどれだけの操作を必要とするかを誰も気にせず、これはすべての実際的なケースで瞬時に行われます。したがって、可能な限り少ない操作を使用するために、任意のルールに対する読みやすさを考慮します。
サイラス

5
@Psirus私は、これはワームの缶を開くつもりはない願っていますが、あまり操作を使用してのアイデアは、一定レベルのショーケースである熟練低い動作を制御します。たとえば、@ Thorの答えは、bashパラメータ拡張機能の評価を示していbashます。これは、OPが使用している場合でもうまく機能します。読みやすさ(非常に冗長になるまで)と適切なツールの使用との間には微妙なバランスがありますが、多くの場合、適切なツールを使用しない方が優先されます。
hjk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.