Regex 使用Sed/awk/grep或任何其他工具在Linux环境中提取子字符串
我只想从一个特定的字符串中获取子字符串 例如,我有Regex 使用Sed/awk/grep或任何其他工具在Linux环境中提取子字符串,regex,linux,awk,sed,grep,Regex,Linux,Awk,Sed,Grep,我只想从一个特定的字符串中获取子字符串 例如,我有“sec(name=test)”字符串。我想使用shell提取name=test字符串 我尝试了下面的命令来提取“name=test”值。但是,我得到的结果是sec() 你能帮我修复一下吗?你很接近了,但是除非你想要egrep(这可能可用,也可能不可用),sed和基本正则表达式就可以了,例如 $ echo "sec(name=test)"| sed 's/^[^(]*(\([^)]*\)).*$/\1/' name=test 标准替换命令的详细
“sec(name=test)”
字符串。我想使用shell提取name=test
字符串
我尝试了下面的命令来提取“name=test”
值。但是,我得到的结果是sec()
你能帮我修复一下吗?你很接近了,但是除非你想要
egrep
(这可能可用,也可能不可用),sed
和基本正则表达式就可以了,例如
$ echo "sec(name=test)"| sed 's/^[^(]*(\([^)]*\)).*$/\1/'
name=test
标准替换命令的详细信息是s/find/replace/
,其中find
部分在某种程度上是一种设置,用于收集要在命令的replace
部分中使用的反向引用。比如说,
查找部分
^
-锚定在字符串开头开始匹配
[^(]*
-匹配[…类..]
中的所有字符,这些字符是“^(
(不是开头部分)
(
-使用期初价格
\(…\)
收集要另存为反向引用的字符,这些字符是“[^)]*
所有字符都不是结束符
)
-使用结束价
*$
-行的其余部分
更换零件
\1
插入保存为第一个反向引用的字符(介于\(…\)
之间的内容,在您的示例中是name=test
而且,您已经完成了……使用Gnu,您还可以编写
echo "sec(name=test)"| sed -r 's/sec\(([^)]*)\)/\1/'
有了sed-r,你的圆形父母在分组时不需要被蒙蔽,而是字面意思。有关更多详细信息,请参阅男子sed
这将查找秒(,然后查找任意数量的字符,这些字符不是结束符,然后是结束符。grep
将打印匹配行,或者使用匹配的字符串。-o
捕获括号本身不会做任何更改
grep-p
有一种方法可以说“匹配括号内的内容,但仅当以下环顾词也匹配时”,这样您就可以
echo "sec(name=test)"| grep -oP '(?<=sec\().*?(?=\))'
请注意,sed
使用的正则表达式方言比grep-p
支持的更简单,尤其是不带引号的括号()
逐字匹配,而反斜杠用于分组——与Perl中的工作方式相反,例如,egrep
请不要要求教程。对于特定的编程问题,您应该问特定的问题。因为堆栈溢出隐藏了关闭原因:要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题与Stack Overflow无关,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决此问题所做的工作。“目标是您添加一些自己的代码,以显示您自己为解决此问题所做的研究工作。@jww我尝试使用下面的命令进行提取。但是,我得到的结果类似于sec()。但是,我想得到name=test.echo“sec(name=test)”| grep-P(sec(.*)“这应该可以工作grep-oP'\(\K[^)]+“
-r
是不可移植的;有些方言使用-E
,有些sed
实现根本不支持扩展正则表达式。你是对的。大多数Linux都带有Gnu-sed,但当然不能保证它的可移植性。非常感谢你的详细解释@David C.Rankin,正如预期的那样。
echo "sec(name=test)"| grep -oP '(?<=sec\().*?(?=\))'
echo "sec(name=test)"| sed -n 's/.*sec\(([^()]*)\).*/\1/p'