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

싱글로 할 수 있습니다 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의 매개 변수 확장 솔루션 또는 다른 것이 필요합니다.
Adam Katz

물론 :-) thx ...
Greg

작은 따옴표를 사용할 때 이러한 괄호를 이스케이프 처리하지 않아도됩니다.
jgmjgm

@jgmjgm 확장 정규 표현식을 사용하여 백 슬래시를 생략 할 수 있습니다 sed -r.
jimmij

1
@VinayPotluri 시험해보십시오 sed -r 's/(.*)-(.*)-/\1 \2 /').
jimmij


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 가지 작업을합니까?
Joshpbarron

7
정규 표현식에 대한 기본 지식 만 가진 사람에게는이 대답이 훨씬 더 접근하기 쉬운 것 같습니다. 그리고 얼마나 많은 작업을 수행해야하는지에 관심이있는 사람은 모든 실제 사례에 즉각적으로 적용됩니다. 따라서 가능한 적은 작업을 사용하기 위해 임의의 규칙에 대한 가독성을 고려할 것입니다.
사이러스

5
@Psirus 나는이 벌레의 깡통을 열어하지 않을 좋겠지 만 적은 작업을 사용하는 아이디어는 일정 수준의 전시하는 지배작은 작업을. 예를 들어 @Thor의 답변은 bash매개 변수 확장 기능에 대한 감사를 보여 주며 OP가 사용 중일 bash때도 잘 작동합니다 . 가독성 (매우 장황한 시점까지)과 올바른 도구 사용 사이에는 미묘한 균형이있을 수 있지만 올바른 도구를 사용하지 않는 것보다 더 자주 사용됩니다.
hjk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.