[英]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 方言,但无论如何您必须了解差异),并且无法告诉您周围的脚本做什么。
p
是s
命令的标志。 在我的系统上,它没有记录在man
页中,而是在info
页中。
'p'
如果进行了替换,则打印新的模式空间。
'\''
舞蹈只是如何在 bash 参数中插入单引号的常用方法。 在“引号删除”期间会删除单引号,并且不能嵌套单引号。 所以你需要结束带引号的字符串,转义一个引号,然后开始另一个带引号的字符串。 您还可以在野外找到替代'"'"'
。
因此,sed 会将其视为参数(我使用传统的/
而不是|
因为没有必要使用|
):
s/^declare -ax* \([^=]*\)='\(.*\)'.*$/\1=\2/p
在行首搜索declare
( ^
) 后跟一个空格, -a
可能还有x
或xx
或xxx
等; 后跟一个空格和除=
之外的任何内容,然后是=
,然后是单引号中的任何内容。 我们不在乎最后一个单引号后面的内容。 这两个东西在\1
和\2
中被记住,整行被\1=\2
替换,即从其中删除了declare -axxx
,最外面的单引号也是如此。 如果该行与正则表达式不匹配,则不打印任何内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.