搜索字符串并删除直到出现下一个字符

搜索字符串并删除直到出现下一个字符

字符串 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

相关内容