sed -n "s/^.*\(captureThis\).*$/\1/p"
-n don't print lines
s substitute
^.* matches anything before the captureThis
\( \) capture everything between and assign it to \1
.*$ matches anything after the captureThis
\1 replace everything with captureThis
p print it
使用 中的
-o
选项grep
。例如:
2件事:
-o
选项,因此只打印匹配项(而不是整行)-P
选择使用 Perl 正则表达式,其中包括有用的元素,例如Look ahead(?= )
和Look behind(?<= )
,它们查找部分,但实际上并不匹配和打印它们。如果您只想匹配括号内的部分,请执行以下操作:
如果文件包含 sting
/(a)5667/
,则 grep 将打印 'a',因为:/(
被 找到\/\(
,但由于它们处于后视状态,(?<= )
因此未报告a
被匹配\w
并因此被打印(因为-o
))5667/
由 找到\).+\/
,但由于它们处于前瞻(?= )
中,因此未报告因为除了shell之外,您还将问题标记为bash ,所以除了grep之外还有另一个解决方案:
Bash 从 3.0 版开始就有自己的正则表达式引擎,使用
=~
运算符,就像 Perl 一样。现在,给定以下代码:
bash
而不仅仅是sh
为了获取所有扩展$BASH_REMATCH
将给出与整个正则表达式匹配的整个字符串,所以<Lane>8</Lane>
${BASH_REMATCH[1]}
将给出与第一组匹配的部分,因此只有8
如果您只想要括号中的内容,则需要支持捕获子匹配项(命名或编号捕获组)的内容。我不认为 grep 或 egrep 可以做到这一点, perl 和 sed 可以。例如,使用 perl:
如果名为 foo 的文件中有一行如下所示:
你也是:
返回字母 a。不过,这可能不是您想要的。如果您告诉我们您要匹配的内容,您可能会得到更好的帮助。$1 是第一组括号中捕获的任何内容。$2 将是第二套等。
假设文件包含:
>
并且您想要and之间的字符</
,您可以使用:grep
grep -oP '.*\K(?<=>)\w+(?=<\/)' file
sed
sed -nE 's:^.*>(\w+)</.*$:\1:p' file
awk
awk '{print(gensub("^.*>(\\w+)</.*$","\\1","g"))}' file
perl
perl -nle 'print $1 if />(\w+)<\//' file
所有将打印一个字符串“xyz”。
如果要捕获此行的数字:
grep
grep -oP '.*\K(?<=>)[0-9]+(?=<\/)' file
sed
sed -E 's:^.*>([0-9]+)</.*$:\1:' file
awk
awk '{print(gensub(".*>([0-9]+)</.*","\\1","g"))}' file
perl
perl -nle 'print $1 if />([0-9]+)<\//' file
这将完成您的要求,但我认为这不是您真正想要的。我把 放在
.*
正则表达式的前面是为了在比赛前吃掉任何东西,但这是一个贪婪的操作,所以这只匹配字符串中的倒数第二个\w
字符。请注意,您需要转义括号和
+
.