我只需要从正则表达式中获取匹配项:
$ cat myfile.txt | SOMETHING_HERE "/(\w).+/"
输出必须仅仅是括号内匹配的内容。
我不认为我能用grep因为它与整行相匹配。
请告诉我如何做到这一点。
答案1
2件事:
- 正如@Rory 所述,您需要该
-o
选项,因此只打印匹配项(而不是整行) - 此外,你还可以
-P
选择使用 Perl 正则表达式,其中包括以下有用的元素:展望(?= )
和向后看(?<= )
,它们寻找零件,但实际上并不匹配和打印它们。
如果只想匹配括号内的部分,请执行以下操作:
grep -oP '(?<=\/\()\w(?=\).+\/)' myfile.txt
如果文件包含字符串/(a)5667/
,grep 将打印“a”,因为:
/(
被发现\/\(
,但因为他们在向后看(?<= )
他们没有被报道a
与 匹配\w
,因此被打印(因为-o
))5667/
被发现\).+\/
,但因为他们在展望(?= )
他们没有被报道
答案2
使用-o
中的选项grep
。
例如:
$ echo "foobarbaz" | grep -o 'b[aeiou]r'
bar
答案3
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
答案4
假设文件包含:
$ cat file
Text-here>xyz</more text
>
并且您想要和之间的字符</
,您可以使用:
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”。
如果你想捕获这一行的数字:
$ cat file
Text-<here>1234</text>-ends
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