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'