Grep使用正则表达式并使用组捕获

时间:2019-05-31 06:33:16

标签: linux terminal grep

我有多个包含以下内容的文本文件: “”“版本:3.4.0.0 xxx xxx xxx“”“ 我正在尝试从每个文本文件捕获3.4.0.0并显示在终端上。 我写的命令是这样的:

 {
 "particles": {
 "number": {
 "value": 80,
 "density": {
 "enable": true,
 "value_area": 800
 }
 },
 "color": {
 "value": "#ffffff"
 },
 "shape": {
 "type": "circle",
 "stroke": {
 "width": 0,
 "color": "#000000"
 },
 "polygon": {
 "nb_sides": 5
 },
 "image": {
 "src": "img/github.svg",
 "width": 100,
 "height": 100
 }
 },
 "opacity": {
 "value": 0.5,
 "random": false,
 "anim": {
 "enable": false,
 "speed": 1,
 "opacity_min": 0.1,
 "sync": false
 }
 },
 "size": {
 "value": 3,
 "random": true,
 "anim": {
 "enable": false,
 "speed": 40,
 "size_min": 0.1,
 "sync": false
 }
 },
 "line_linked": {
 "enable": true,
 "distance": 150,
 "color": "#ffffff",
 "opacity": 0.4,
 "width": 1
 },
 "move": {
 "enable": true,
 "speed": 6,
 "direction": "none",
 "random": false,
 "straight": false,
 "out_mode": "out",
 "bounce": false,
 "attract": {
 "enable": false,
 "rotateX": 600,
 "rotateY": 1200
 }
 }
 },
 "interactivity": {
 "detect_on": "canvas",
 "events": {
 "onhover": {
 "enable": true,
 "mode": "repulse"
 },
 "onclick": {
 "enable": true,
 "mode": "push"
 },
 "resize": true
 },
 "modes": {
 "grab": {
 "distance": 400,
 "line_linked": {
 "opacity": 1
 }
 },
 "bubble": {
 "distance": 400,
 "size": 40,
 "duration": 2,
 "opacity": 8,
 "speed": 3
 },
 "repulse": {
 "distance": 200,
 "duration": 0.4
 },
 "push": {
 "particles_nb": 4
 },
 "remove": {
 "particles_nb": 2
 }
 }
 },
 "retina_detect": true
}

使用以上代码无法获得任何结果。有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

您的模式是PCRE兼容的正则表达式,[\s\S]与PCRE模式中的任何字符匹配,但与您在grep中使用的POSIX BRE regex风格不匹配,因为您没有使用{{1 }}选项。

如果要使用GNU grep进行操作

-P

请参见this online demo

详细信息

  • grep -oPm 1 'Version\s*:\s*\K\d+(?:\.\d+)+' *.txt -Version字符串
  • Version-用0+空格括起来的冒号
  • \s*:\s*-匹配重置运算符
  • \K-1个以上的数字,然后
  • \d+-1个或多个(?:\.\d+)+和1+个数字的重复。

您可以使用.来做到这一点:

awk

请参见online awk demo

awk '/^Version : [0-9]+/{print $3; exit}' *.txt

详细信息

  • s="Text Version : 3.4.0.0 xxx xxx xxx More text Version : 5.6.0.0 xxx xxx xxx" awk '/^Version : [0-9]+/{print $3; exit}' <<< "$s" # => 3.4.0.0 找到以^Version : [0-9]+开头的行
  • Version : <1 or more digits>输出字段3的值,并停止处理以使您仅获得第一个匹配项。