如何对单引号之间的所有内容进行grep?

时间:2018-10-09 14:20:22

标签: bash sed grep

我在弄清楚如何grep两个单引号之间的字符时遇到了麻烦。

我在文件中有这个 version: '8.x-1.0-alpha1'

并且我喜欢这样的输出(版本号可以是多种):

8.x-1.0-alpha1

我写了以下内容,但不起作用:

cat myfile.txt | grep -e 'version' | sed 's/.*\?'\(.*?\)'.*//g'

谢谢您的帮助。

添加: 我使用了sed命令sed -n "s#version:\s*'\(.*\)'#\1#p" 我还想删除我编辑为sed -n "s#version:\s*'8.x-\(.*\)'#\1#p"的8.x-。

此命令仅在Linux上有效,而在MAC上无效。如何更改此命令以使其在MAC上有效?

sed -n "s#version:\s*'8.x-\(.*\)'#\1#p"

5 个答案:

答案 0 :(得分:2)

如果您只想从文件中获取该信息,并且只有该信息可以快速进行:

awk -F"'" '/version/{print $2}' file

示例:

$ echo "version: '8.x-1.0-alpha1'" | awk -F"'" '/version/{print $2}'
8.x-1.0-alpha1

这是如何工作的?

awk程序是一系列模式-动作对,写为:

condition { action }
condition { action }
...

其中condition通常是一个表达式,action是一系列命令。

  1. -F "'"在这里,我们告诉将字段分隔符FS定义为<单引号> '。这意味着所有行将被分成字段$1$2,...,$NF,并且在每个字段之间都有一个'。现在,我们可以通过将$1用于第一个字段,将$2用于第二个...等等来引用这些字段,直到$NF,其中NF是字段的总数每行。

  2. /version/{print $2} :这是条件操作对。

    • 条件:/version/ ::条件读取:如果当前记录/行中的子字符串与正则表达式/version/匹配,则执行action 。在这里,如果当前行包含子字符串version

    • ,则将其简单翻译为
    • 操作:{print $2} ::如果满足先前条件,则打印第二个字段。在这种情况下,第二个字段将是OP请求的内容。

现在有几件事可以做。

  1. condition修改为/^version :/ && NF==3,它读取_如果当前行以子字符串version :开头,并且并且当前行有3个字段,则做action

  2. 如果只希望第一次出现,可以通过将操作更新为exit

  3. 来告诉系统找到后立即{print $2; exit}

答案 1 :(得分:2)

我将在pcre regexes中使用GNU grep:

TEST-IDENTIFIER

我们正在寻找“版本:'”的地方,然后<your_test_bundle_to_run>指令将忘记刚刚看到的内容,而使grep -oP "version: '\\K.*(?=')" file 匹配最后一个单引号。

答案 2 :(得分:0)

尝试类似以下操作:sed -n "s#version:\s*'\(.*\)'#\1#p" myfile.txt。这样可以通过找到“版本”行并提取单引号之间的内容来避免多余的catgrep

说明:

-n标志告诉sed不要自动打印行。然后,我们在sed模式的末尾使用p命令来在找到版本行时显式打印。

搜索模式:version:\s*'\(.*\)'

  • version:\s*匹配“版本”,后跟任意数量的空白
  • '\(.*\)'匹配一个',然后捕获所有内容,直到下一个'

替换为:\1;这是上面的第一个(也是唯一的)捕获组,包含单引号之间的内容。

答案 3 :(得分:0)

grep几乎可以单独做到这一点:

grep -o "'.*'" file.txt

但这也可能会打印您不希望使用的行:它将打印所有带有2个单引号(')的行。并且输出仍然在其周围加上单引号('

'8.x-1.0-alpha1'

但是只有sed可以正确地做到这一点:

sed -rn "s/^version: +'([^']+)'.*/\1/p" file.txt

答案 4 :(得分:0)

当您只想查看他的报价时,可以使用cut

grep -e 'version' myfile.txt | cut -d "'" -f2