문자열 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