문자열을 검색하고 다음 문자가 나타날 때까지 삭제합니다.

문자열을 검색하고 다음 문자가 나타날 때까지 삭제합니다.

문자열 1:svn+ssh://[email protected]/repo-2015/branches/DEV_BRANCH_21/main/code/main_input.c

출력 필요:main/code/main_input.c

문자열 2:svn+ssh://[email protected]/repo-2015/branches/TEST_BRANCH_56/main/code/main_output.c

출력 필요:main/code/main_output.c

이런 것을 시도했습니다.

echo "svn+ssh://[email protected]/repo 2015/branches/DEV_BRANCH_21/main/code/main_input.c" | sed -e 's/^.*\(branches\/\)//g'

분기 후 다음 "/"를 어떻게 진행하고 삭제하는지 잘 모르겠습니다.

답변1

$ echo "svn+ssh://[email protected]/repo 2015/branches/DEV_BRANCH_21/main/code/main_input.c" | grep -oP 'branches/.*?/\K.*'
main/code/main_input.c

$ echo "svn+ssh://[email protected]/repo-2015/branches/TEST_BRANCH_56/main/code/main_output.c" | grep -oP 'branches/.*?/\K.*'
main/code/main_output.c
  • branches/.*?/\K문자열 일치, branches다음 /, 다음 텍스트를 나타냅니다 /. 바라보다perldoc - 문서 둘러보기추가 읽기를 위해

그리고sed

sed 's|.*branches/[^/]*/||'
  • [^/]*이외의 텍스트와 일치합니다./

답변2

POSIX 셸 모드 스트리핑 연산자를 사용합니다.

string=svn+ssh://srv.com/repo/branches/TEST_BRANCH_56/main/code/main_output.c
output=${string#*/branches/*/}

$string그러면 패턴과 일치하는 가장 작은 선행 부분이 제거됩니다. 다음과 다릅니다:

printf '%s\n' "$string" | sed '
  :1
  $!{
   N;b1
  }
  s|.*/branches/[^/]*/||'

또는:

expr " $string" : ' .*/branches/[^/]*/\(.*\)'

이 경우 string=foo/branches/bar/branches/baz/whatever하나는 ${string#pattern}반환 branches/baz/whatever되고 다른 하나는 반환됩니다 whatever.

답변3

나는 다음과 같이 grep을 사용할 것입니다 :

echo "svn+ssh://[email protected]/repo 2015/branches/DEV_BRANCH_21/main/code/main_input.c" | grep -Eo "main\/code.*"

답변4

awk 정규식을 사용하지 않고 간단한 방법:

$ awk '{print substr($0,match($0,/main/));}' input.txt                                                                   
main/code/main_input.c
main/code/main_output.c

관련 정보