我想使用正则表达式来提取前两个单词以及字符串的倒数第二个字母 例如,在字符串
中 "CSC 101 Intro to Computing A R"
我想抓拍
"CSC 101 A"
也许与此类似的东西
grep -o -P '\w{3}\s\d{3}*thenIdon'tKnow*\s\w\s'
非常感谢任何帮助。
答案 0 :(得分:0)
整个RegEx模式不能与脱节组匹配。
我建议看一下捕获组 - 基本上你捕获了两个脱节组,然后可以通过引用这两个组来使用匹配的单词组。
grep
无法打印出多个捕获组,因此sed
的示例为
打印echo 'CSC 101 Intro to Computing A R' | sed -n 's/^\(\w\{3\}\s[[:digit:]]\{3\}\).*\?\(\w\)\s\+\w$/\1 \2/p'
的{{1}}
请注意,此处使用的模式为^(\w{3}\s\d{3}).*?(\w)\s+\w$
答案 1 :(得分:0)
执行:
^(\S+)\s+(\S+).*(\S+)\s+\S+$
3个被捕获的组捕获了3个所需的魔药
\S
表示任何非空白字符
\s
表示任何空格字符
正如您在示例中使用grep
和PCRE一样,我假设您可以访问GNU工具集。使用GNU sed
:
% sed -E 's/^(\S+)\s+(\S+).*(\S+)\s+\S+$/\1 \2 \3/' <<<"CSC 101 Intro to Computing A R"
CSC 101 A
答案 2 :(得分:0)
你可以去:
^((?:\w+\W+){2}).*(\w+)\W+\w+$
并使用第1 + 2组,见working on regex101.com
<小时/> 细分,这说:
^ # match the start of the line/string
( # capture group 1
(?:\w+\W+){2} # repeated non-capturing group with words/non words
)
.* # anything else afterwards
(\w+)\W+\w+ # backtracking to the second last word character
$