提取两个匹配单词之间的所有单词

提取两个匹配单词之间的所有单词

我有一行如下,我需要之间的所有单词选择完毕

 vertical on; select blah blah blah contains all special characters including /*?&;  Done

答案1

使用 bash 正则表达式会给出(假设变量中的行):

$ line="vertical on; select blah blah blah contains all special characters including /*?&;  Done"
$ [[ "$line" =~ select(.*)Done ]] && echo ${BASH_REMATCH[1]}
blah blah blah contains all special characters including /*?&;

答案2

尝试这个,

 sed -e 's/.*select//;s/Done.*//'

答案3

尝试

sed -e 's/select\(.*\)Done/\1/'

答案4

使用 Perl 兼容的正则表达式 (PCRE):

(?<=word1).*?(?=word2)

将上述模式应用于 GNU grep

$ grep -Po '(?<=select).*?(?=Done)' <<< ' vertical on; select blah blah blah contains all special characters including /*?&;  Done'
 blah blah blah contains all special characters including /*?&;  

解释

  • (?<=word1): 匹配word1 当前位置,但不将其包含在结果中。
  • .*?:匹配任意字符串。
  • (?=word2): 匹配word2 当前位置,但不将其包含在结果中。

(?<=word1)模式(?=word2)统称为环视四周。 POSIX 引擎(BRE 和 ERE)不支持此功能,因此您需要更强大的引擎(例如 PCRE)。

相关内容