我是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方言,但无论如何你都必须理解其中的差异(,并且不能告诉你周围的脚本是做什么的。
p
是s
命令的标志。在我的系统中,它没有记录在man
页面中,而是在info
页面中。
'p'
如果进行了替换,则打印新的图案空间。
'''
舞蹈只是如何在bash参数中插入一个引号的常见方法。在";引号删除";并且不能嵌套单引号。因此,您需要结束引用的字符串,转义一个引用,然后开始另一个引用的字符串。你也可以在野外找到替代品'"'"'
。
因此,sed会将其视为参数(我使用了传统的/
而不是|
,因为不需要使用|
(:
s/^declare -ax* ([^=]*)='(.*)'.*$/1=2/p
其在后面跟着空格的行(^
(的开头搜索declare
、-a
以及可能的x
或xx
或xxx
等。;然后是一个空格和除=
之外的任何内容,然后是=
,然后是单引号中的任何内容。我们不在乎最后一句话后面是什么。这两个任意项在1
和2
中被记住,整行被1=2
替换,即declare -axxx
被删除,最外面的单引号也是如此。如果该行与正则表达式不匹配,则不打印任何内容。