这个sed语法是什么意思?"S/MY_BASE_DIR = \(.*\)/ MY_BASE_DIR = $ {MY_BASE_DIR-\1} /"

Mül*_*ler 3 bash sed

这是一个简单的问题,但我无法在教程中找到它.任何人都可以解释一下这个语句在包含.sh脚本的文件夹中的bash shell中执行时的作用.我知道-i做了编辑,我知道它将在当前目录中的所有脚本上运行sed.而且我知道它会做某种替代.但这\(.*\)意味着什么?

sed -i 's/MY_BASE_DIR=\(.*\)/MY_BASE_DIR=${MY_BASE_DIR-\1}/' *.sh
Run Code Online (Sandbox Code Playgroud)

提前致谢.

fed*_*qui 7

你有一个表达式:

sed -i 's/XXX=\(YYY\)/XXX=ZZZ/' file
Run Code Online (Sandbox Code Playgroud)

这会XXX=在文件中查找字符串并捕获后续内容.然后,它用这个捕获的内容替换ZZZ.由于存在捕获的组,因此可以访问它\1.最后,使用-i旗帜sed使版本就位.

对于替换,它使用Shell参数扩展中描述的以下语法:

$ {参数:-word}

如果参数未设置或为null,则替换单词的扩展.否则,参数的值将被替换.

例:

$ d=5
$ echo ${d-3}
5
$ echo ${a-3}
3
Run Code Online (Sandbox Code Playgroud)

所以${MY_BASE_DIR-SOMETHING-\1}你说:打印$MY_BAS_DIR.如果此变量未设置或为null,则打印存储的内容\1.

总之,这是重置MY_BASE_DIR为变量中的值,$MY_BASE_DIR除非没有设置; 在这种情况下,值保持不变.

请注意,除非使用双引号,否则不会扩展变量.


测试:

$ d=5
$ cat a
d=23
blabla
$ sed "s/d=\(.*\)/d=${d-\1}/" a   # double quotes -> value is replaced
d=5
blabla
$ sed 's/d=\(.*\)/d=${d-\1}/' a   # single quotes -> variable is not expanded
d=${d-23}
blabla
Run Code Online (Sandbox Code Playgroud)

如果$d没有设置,Andd会看到值是如何保持不变的:

$ unset d
$ sed "s/d=\(.*\)/d=${d-\1}/" a
d=23
Run Code Online (Sandbox Code Playgroud)