我想使用正则表达式来提取字符串的前几个单词和倒数第二个字母。
例如,在字符串中
"CSC 101 Intro to Computing A R"
我想捕捉
"CSC 101 A"
也许与此类似
grep -o -P '\w{3}\s\d{3}*thenIdon'tKnow*\s\w\s'
任何帮助将不胜感激。
你可以去:
^((?:\w+\W+){2}).*(\w+)\W+\w+$
并使用组 1 + 2,看到它在 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
$
做:
^(\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
整个 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'
CSC 101 A
^(\w{3}\s\d{3}).*?(\w)\s+\w$