sed를 사용하여 파일의 모든 행에 대해 첫 번째 패턴 발생을 한 행으로 대체


16

하나의 라이너로 할 수 있습니까?

다음과 같은 출력이 있습니다.

"First line" - Description  
" Second line" - Description  
"Third line" - Description  
" Fourth line" - Description  

이 입력은 자동으로 생성됩니다.

각 줄 의 첫 번째 "(따옴표 + 공백)를 "(따옴표 ) 로 바꾸고 싶습니다 . I는 전체적으로 교체를 적용한 경우도 발생할 때마다 변화한다 line" -행을 line"-가 이것을 달성하기 위해 나오지 하나의 라이너를 사용 가능한지 궁금 있도록.

나는 ^이런 식으로 사용하려고

sed -r ':a;N;$!ba;s/(\^\" )/\"/g'

그러나 작동하지 않고 아무것도 대체하지 않습니다. 나는 시도했다

sed -r ':a;N;$!ba;s/(^|\" )/\"/g'

모든 발생을 대체합니다. 방금 sed를 사용하기 시작했기 때문에 내가 잘못하고 있는지 잘 모르겠습니다.

내가 여기서 무엇을 놓치고 있습니까?


레이블에 대한 참고 사항 : 위에서 작성한 명령은의 일부 구현에서 작동 할 수 sed있지만 이식성과 실제로 이상한 오류를 피하려면 레이블 뒤에 주어진 명령 인수를 끝내야합니다 (필요한 경우). 예 :sed -e ':a' -e 'N;$!ba' -e 'whatever'
와일드 카드

답변:


34

당신은 그것을 너무 생각하고 있습니다. sed행의 첫 번째 인스턴스 만 기본적으로 ( /g수정 자 없이 ) 대체 하지만 고정하기를 원하지만 행의 첫 번째 인스턴스가 행의 시작 인스턴스만큼을 원합니다. 일반적으로 사용하려는 명시적인 라인 작업이 필요하지 않습니다 (왜?).

sed 's/^" /"/'

감사! 파일 작업을 할 때 명시 적으로 행 동작을 선언하고 파일을 읽고 계속 사용하는 것이 필요하다고 생각했습니다. 나는 정말로 그것을 너무 많이 생각했다, 그것은 더 간단 할 수 없었다. 그리고 속임수를한다 :)
Steve B.

나는 그 명령들이 거의 쓸모가 없다고 유혹하고있다. 그들과 함께 매우 복잡한 여러 줄 작업을 수행하는 것이 가능하지만 그렇게하기는 쉽지 않으며 요즘에는 perl / python / ruby ​​/ whatever를 사용하는 것이 좋습니다.
geekosaur

위의 의견에 완전히 동의하지 않습니다. 멀티 라인은 sed같은 명령 N등과 같은 레이블 :a전혀 쓸모없는 그들이 있는 휴대용 및 POSIX가 지정한 / 어떤 펄 / 파이썬 / 루비와는 달리. 그러나 자신 자주 필요하다고 생각되면 배우는awk 것이 사실 입니다.
와일드 카드

2

더 일반적인 대답은 괴짜의 대답에 대해 언급 할 수 없기 때문에 ^ (줄 앵커의 시작)을 넣지 않을 것입니다. 예를 들어 A의 첫 번째 항목을 B로 바꾸려면

sed 's/A/B/'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.