繁体   English   中英

了解 sed 正则表达式模式

[英]Understanding sed regex pattern

我对 Linux 世界很陌生,我正在尝试掌握基本命令。 在浏览其中一个脚本时,观察到以下行,我无法理解。

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

通过 SED 并声明手册页,我对标志/选项有所了解,例如 -n 和 -e,但不确定上面给出的类似正则表达式的模式以及命令末尾的“p”到底是做什么的?

试图在 regex101 网站上重现上述行,但没有运气:(

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

第二个从declare -ax variable=value中提取变量和值,并在引用方面有一些复杂性。 x是可选的(严格来说,正则表达式允许零个或多个,但您可能不会期望超过一个)。

再详细一点,

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

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

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

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

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

'\''舞蹈只是如何在 bash 参数中插入单引号的常用方法。 在“引号删除”期间会删除单引号,并且不能嵌套单引号。 所以你需要结束带引号的字符串,转义一个引号,然后开始另一个带引号的字符串。 您还可以在野外找到替代'"'"'

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

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

在行首搜索declare ( ^ ) 后跟一个空格, -a可能还有xxxxxx等; 后跟一个空格和除=之外的任何内容,然后是= ,然后是单引号中的任何内容。 我们不在乎最后一个单引号后面的内容。 这两个东西在\1\2中被记住,整行被\1=\2替换,即从其中删除了declare -axxx ,最外面的单引号也是如此。 如果该行与正则表达式不匹配,则不打印任何内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM