我有一行如下,我需要之间的所有单词选择和完毕
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)。