不需要整行,只需要正则表达式的匹配

不需要整行,只需要正则表达式的匹配

我只需要从正则表达式中获取匹配项:

$ 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 -oP '.*\K(?<=>)\w+(?=<\/)' file
sed -nE 's:^.*>(\w+)</.*$:\1:p' file
awk '{print(gensub("^.*>(\\w+)</.*$","\\1","g"))}' file
perl -nle 'print $1 if />(\w+)<\//' file

全部都会打印字符串“xyz”。

如果你想捕获这一行的数字:

$ cat file
Text-<here>1234</text>-ends

grep -oP '.*\K(?<=>)[0-9]+(?=<\/)' file
sed -E 's:^.*>([0-9]+)</.*$:\1:' file
awk '{print(gensub(".*>([0-9]+)</.*","\\1","g"))}' file
perl -nle 'print $1 if />([0-9]+)<\//' file

相关内容