Linux下使用SED提取句子中两个指定单词间内容的方法求助
Linux环境提取两个指定单词间内容的解决方法
原命令失效原因
你之前使用的sed -e 's/Hello\(.*\)doing/\1/'仅匹配替换了字符串中Hello到doing的片段,doing之后的内容未进入匹配范围会原样输出,因此会残留多余的today?内容。
可用解决方案
方案1:调整SED命令
匹配整行内容,将行首到Hello、doing到行尾的内容全部纳入匹配规则,仅保留中间捕获的内容:
sed -e 's/.*Hello\(.*\)doing.*/\1/'
测试效果:
echo "Hello world, how are you doing today?" | sed -e 's/.*Hello\(.*\)doing.*/\1/' # 输出: world, how are you
如果存在单个行内有多个doing的场景,需要提取第一个Hello和第一个doing之间的内容,可以使用GNU sed的扩展正则写法:
sed -r 's/.*Hello([^[:space:]]*.*?)doing.*/\1/'
方案2:使用GNU GREP命令(更简洁)
利用Perl正则的前后向断言直接提取目标内容:
grep -oP '(?<=Hello).*(?=doing)'
方案3:使用AWK实现(兼容性更好)
以Hello和doing作为分隔符,直接提取第二个字段即为目标内容:
awk -F 'Hello|doing' '{print $2}'
内容的提问来源于stack exchange,提问作者Ivan Kanchev
相关产品推荐
相关产品推荐

