字符串 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 shell 模式剥离运算符:
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