Ale*_*x L 27 shell bash grep regex
我只需要从正则表达式中获取匹配项:
$ cat myfile.txt | SOMETHING_HERE "/(\w).+/"
Run Code Online (Sandbox Code Playgroud)
输出必须只是括号内匹配的内容。
不要认为我可以使用grep因为它匹配整行。
请让我知道如何做到这一点。
Ama*_*rus 24
使用中的-o选项grep。
例如:
$ echo "foobarbaz" | grep -o 'b[aeiou]r'
bar
Run Code Online (Sandbox Code Playgroud)
DrY*_*Yak 23
2件事:
-o选项,因此仅打印匹配项(而不是整行)-P选择使用 Perl 正则表达式,其中包括有用的元素,例如Look forward (?= )和Look behind (?<= ),这些元素查找部件,但实际上并不匹配和打印它们。如果您只想匹配括号内的部分,请执行以下操作:
grep -oP '(?<=\/\()\w(?=\).+\/)' myfile.txt
Run Code Online (Sandbox Code Playgroud)
如果文件包含 sting /(a)5667/,grep 将打印 'a',因为:
/(被 找到\/\(,但因为它们在后视中, (?<= )所以没有被报告a被匹配\w并因此被打印(因为-o))5667/由 找到\).+\/,但由于它们处于先行状态 (?= ),因此未报告小智 16
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
Run Code Online (Sandbox Code Playgroud)
因为除了shell之外,您还将问题标记为bash,所以在grep旁边还有另一个解决方案:
Bash 从 3.0 版开始就有自己的正则表达式引擎,使用=~操作符,就像 Perl 一样。
现在,给出以下代码:
#!/bin/bash
DATA="test <Lane>8</Lane>"
if [[ "$DATA" =~ \<Lane\>([[:digit:]]+)\<\/Lane\> ]]; then
echo $BASH_REMATCH
echo ${BASH_REMATCH[1]}
fi
Run Code Online (Sandbox Code Playgroud)
bash而不仅仅是sh为了获得所有扩展$BASH_REMATCH 将给出与整个正则表达式匹配的整个字符串,所以 <Lane>8</Lane>${BASH_REMATCH[1]} 将给出与第一组匹配的部分,因此只有 8