2011-09-07 4 views
1

sed : 정규 표현식의 일부를 사용하여 텍스트 구문 분석

다음과 같은 텍스트 줄이 있습니다.

/src/my_module_my_branch/my_module 

예 : /src/goodcode_dev/goodcode

변환해야합니다.

/src/my_branch/my_module 

예 : /src/dev/goodcode

문제가 있습니다. 모듈과 분기 모두 밑줄을 포함 할 수 있습니다. 그래서 첫 번째 부분에서 모듈을 식별하고 분기 이름을 추출하는 데 사용해야합니다. 그런 변환을하기 위해 sed를 사용하는 방법이 있습니까?

+0

를 대체하는 데 사용할 수 있습니다. 그렇다면 모듈에 공통적 인 명명 구조 (예 :'_'의 고정 숫자)가 없기 때문에 모듈 당 하나의 정규식을 사용하지 않고 구현할 수있는 방법을 모르겠다.). – Mat

답변

1

GNU sed를 사용하고 있다면이 방법이 효과적입니다. 모든 것이 /src/으로 시작한다고 가정합니다. 영어

sed -r 's/^\/src\/([^/]+)_([^/]+)\/\1$/\/src\/\2\/\1/' 

는 :

확장 정규식 (-r)를 호출 sed+가 작동 할 수 있도록. 라인 시작 부분에 /src/, 그룹 1 : 하나 이상의 슬래시, _, 그룹 2 : 하나 이상의 슬래시, /, 그룹 1, 줄 끝과 일치시킵니다. /src/로 변경, 그룹 2, /, 그룹 1

+0

+1, 다른 응답이있는 사람이 작성한 것 같습니다. regex backreferences에 익숙하지 않습니다. – tripleee

+0

고마워요! 이것은 내가 찾고 있었던 것이다! 나는 같은 표현에서 그룹화 절을 사용하는 옵션을 알지 못했습니다. 매우 강력한 기능. –

0

"모듈"과 "분기"파트간에 차이가 없다면 아니오라고 말하고 싶습니다. 즉, my_module_my이 모듈 일 수 있고 branch 분기 인 경우 sed은 어떻게 알 수 있습니까?

+0

물론,'sed'를 실행하기 전에 모듈이나 브랜치 이름을 검색 할 수 있다면, 그것은 사소한 일입니다. 그렇다고 생각하지 않습니다. – carlpett

+0

일부 파이프에서 텍스트를 바꾸고 있기 때문에 한 번에 (또는 한 번의 반복 작업으로 몇 가지 작업을 수행 할 수있는 awk 스크립트를 작성해야합니다.) –

1

먼저, 다음, 마지막 부분을 찾을 난 당신이 하나 개 이상의 모듈이 있으리라 믿고있어

$ echo "/src/my_module_my_branch/my_module" | awk -F"/" '{n=$NF;gsub(n"_","",$3);print}' OFS="/" 
/src/my_branch/my_module