理解sed正则表达式模式



我是Linux世界的新手,我正在尝试掌握基本命令。在浏览其中一个脚本时,观察到了下面的一行,我无法理解。

sed -n -e 's|declare -x ||p' -e 's|^declare -ax* ([^=]*)='''(.*)'''.*$|1=2|p'

通过SED&在声明手册页时,我对标志/选项有了一些想法,比如-n和-e,但不确定上面给出的类似regex的模式以及";p〃;命令结束了吗?

尝试在regex101站点上复制上面的行,但没有成功:(

第一个表达式只是删除任何declare -x

第二部分从declare -ax variable=value中提取变量和值,并对引用进行了一些复杂的处理。x是可选的(严格地说,regex允许零或更多,但您可能不希望有多个(。

更详细地说,

  • s|regex|replacement|只是用replacement替换regex的任何匹配,使用|作为正则表达式分隔符,而不是默认的/
  • 如果发生替换,则具有p标志的s|regex|replacement|p打印结果行;这通常与CCD_ 11组合以仅打印发生替换的行
  • 'whatever'''something'''more stuff'使用shell引用来表示单引号字符串中的文字单引号。不能在单引号中转义单引号,因此它使用一个右单引号,后跟一个反斜杠文字单引号,再后跟另一个左单引号,将单引号嵌入到带引号的字符串中
  • s/(something.*)other/1/something or替换something or other,其中反斜线括号指定分组,而1是对与第一个括号组匹配的文本的反向引用。类似地,2指代第二个带括号的组等

如果意图捕获单引号字符串,括号内的.*实际上是错误的;regex应该只匹配不是单引号的字符(或者根据上面的解释,理想情况下是包含文字单引号的表达式(。

https://regex101.com/不是特别适合于CCD_ 19正则表达式。它不支持sed的regex方言(最接近的可能是ECMAScript方言,但无论如何你都必须理解其中的差异(,并且不能告诉你周围的脚本是做什么的。

ps命令的标志。在我的系统中,它没有记录在man页面中,而是在info页面中。

'p'
如果进行了替换,则打印新的图案空间。

'''舞蹈只是如何在bash参数中插入一个引号的常见方法。在";引号删除";并且不能嵌套单引号。因此,您需要结束引用的字符串,转义一个引用,然后开始另一个引用的字符串。你也可以在野外找到替代品'"'"'

因此,sed会将其视为参数(我使用了传统的/而不是|,因为不需要使用|(:

s/^declare -ax* ([^=]*)='(.*)'.*$/1=2/p

其在后面跟着空格的行(^(的开头搜索declare-a以及可能的xxxxxx等。;然后是一个空格和除=之外的任何内容,然后是=,然后是单引号中的任何内容。我们不在乎最后一句话后面是什么。这两个任意项在12中被记住,整行被1=2替换,即declare -axxx被删除,最外面的单引号也是如此。如果该行与正则表达式不匹配,则不打印任何内容。

最新更新