sed提取包含模式的子字符串

时间:2019-03-13 23:44:27

标签: bash shell

我有以下命令从字符串中提取子字符串,但它不包括模式,请您帮忙。

echo ". ~/.bash_profile ; /home/script/sample.sh >> ~/log/sample.log" | sed -e 's/.*\/home\(.*\)sh.*/\1/'

结果:/script/sample

但是我希望结果是/home/script/sample.sh

2 个答案:

答案 0 :(得分:2)

结果是捕获组\(..\)中的所有内容,因此只需将其扩展到所需的整个范围即可:

echo ". ~/.bash_profile ; /home/script/sample.sh >> ~/log/sample.log" |
    sed -e 's/.*\(\/home.*sh\).*/\1/'

答案 1 :(得分:1)

如果您的字符串/home/script/sample.sh始终位于同一位置,则可以尝试:

echo ". ~/.bash_profile ; /home/script/sample.sh >> ~/log/sample.log" | cut -d' ' -f4
/home/script/sample.sh

如果您对awk感到满意,请尝试执行以下操作,而不考虑字符串home的位置,它将匹配正则表达式并打印。

echo ". ~/.bash_profile ; /home/script/sample.sh >> ~/log/sample.log" | awk 'match($0,/\/home.*\.sh/){print substr($0,RSTART,RLENGTH)}'