sed 명령에 대한 도움이 필요합니다

sed 명령에 대한 도움이 필요합니다

입력이 있습니다

bmb/eng/case.bmb

출력은 다음과 같아야 합니다.

bmb/case.bmb 
bmx/eng/case.bmx

여기서 사용하는 명령은 다음과 같습니다.

$ echo bmb/eng/case.bmb | sed -E 's/.*/& &/;:a;s/([^ ]* [^\n]*)(bm)b/\1\2x/;ta;s~/~&eng&~2'
bmb/eng/eng/case.bmb bmx/eng/case.bmx

위 명령을 다양한 방법으로 수정했지만 예상한 결과가 나오지 않습니다.

답변1

첫째, 한 번에 한 가지 작업을 수행하는 것이 더 쉽기 때문에 copy를 사용하여 줄을 공백에 유지하고 h해당 줄을 수정하여 첫 번째 출력 줄을 생성하고 p인쇄한 다음 복원을 사용하여 줄을 저장 g하고 수정하여 두 번째 출력 줄을 생성합니다. 출력 라인.

s/eng./&/이를 통해 첫 번째 섹션 과 같이 매우 간단한 교체를 수행할 수 있으며 , s_/.*/__디렉터리는 임의의 이름을 가질 수 있거나 하나의 계층 구조보다 더 핵심이 될 수 있습니다. s/bmb/bmx/두 번째 줄도 매우 간단합니다.

echo bmb/eng/case.bmb | sed 'h;s_/.*/_/_;p;g;s/bmb/bmx/g'

원하는 출력을 생성합니다.

워드 프로세서의 클립보드와 마찬가지로 예약된 공간을 사용할 수 있습니다. 이는 매우 다양하고 사용하기 쉬운 도구이지만, 불행하게도 많은 sed사용자가 이 기능을 활용하지 않습니다.

답변2

검색 및 바꾸기 명령을 사용하여 수행할 수 있습니다.

echo 'bmb/eng/case.bmb'|sed -r 's:^(bm)b(/[^/]+)(/.*\.\1)b$:\1b\3b\n\1x\2\3x:'

일치하는 각 조각에 그룹화를 사용하는 경우 ()이러한 조각에서 \1, \2, \3으로 번호가 지정된 두 개의 관심 행을 작성할 수 있습니다.

관련 정보