我在弄清楚如何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"
答案 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
是一系列命令。
-F "'"
:在这里,我们告诉awk将字段分隔符FS
定义为<单引号> '
。这意味着所有行将被分成字段$1
,$2
,...,$NF
,并且在每个字段之间都有一个'
。现在,我们可以通过将$1
用于第一个字段,将$2
用于第二个...等等来引用这些字段,直到$NF
,其中NF
是字段的总数每行。
/version/{print $2}
:这是条件操作对。
条件:/version/
::条件读取:如果当前记录/行中的子字符串与正则表达式/version/
匹配,则执行action
。在这里,如果当前行包含子字符串version
操作:{print $2}
::如果满足先前条件,则打印第二个字段。在这种情况下,第二个字段将是OP请求的内容。
现在有几件事可以做。
将condition
修改为/^version :/ && NF==3
,它读取_如果当前行以子字符串version :
开头,并且并且当前行有3个字段,则做action
如果只希望第一次出现,可以通过将操作更新为exit
{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
。这样可以通过找到“版本”行并提取单引号之间的内容来避免多余的cat
和grep
。
说明:
-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