Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash sed中的逃逸斜杠_Bash_Ubuntu_Sed - Fatal编程技术网

Bash sed中的逃逸斜杠

Bash sed中的逃逸斜杠,bash,ubuntu,sed,Bash,Ubuntu,Sed,我遇到了下面的片段,其中谈到了逃避斜杠的不同方法: echo '/dir1/dir2/usr/local/bin/dir3' | sed 's/\/usr\/local\/bin/\/common\/bin/' echo '/dir1/dir2/usr/local/bin/dir3' | sed 's_/usr/local/bin_/common/bin_' echo '/dir1/dir2/usr/local/bin/dir3' | sed 's:/usr/local/bin:/commo

我遇到了下面的片段,其中谈到了逃避斜杠的不同方法:

echo '/dir1/dir2/usr/local/bin/dir3' | sed 's/\/usr\/local\/bin/\/common\/bin/' 
echo '/dir1/dir2/usr/local/bin/dir3' | sed 's_/usr/local/bin_/common/bin_' 
echo '/dir1/dir2/usr/local/bin/dir3' | sed 's:/usr/local/bin:/common/bin:'
echo '/dir1/dir2/usr/local/bin/dir3' | sed 's|/usr/local/bin|/common/bin|'
结果是:

/dir1/dir2/common/bin/dir3
/dir1/dir2/common/bin/dir3
/dir1/dir2/common/bin/dir3
/dir1/dir2/common/bin/dir3
我的疑问是,为什么在最后三种方法的末尾没有斜杠。我试着在第二个结尾放:

echo '/dir1/dir2/usr/local/bin/dir3' | sed 's/\/usr\/local\/bin/\/common\/bin/' 
echo '/dir1/dir2/usr/local/bin/dir3' | sed 's_/usr/local/bin_/common/bin_/' 
echo '/dir1/dir2/usr/local/bin/dir3' | sed 's:/usr/local/bin:/common/bin:'
echo '/dir1/dir2/usr/local/bin/dir3' | sed 's|/usr/local/bin|/common/bin|'
但有一个错误:

/dir1/dir2/common/bin/dir3
sed: -e expression #1, char 30: unknown option to `s'
/dir1/dir2/common/bin/dir3
/dir1/dir2/common/bin/dir3

这些代码片段表明,基本上可以使用任何字符作为命令的分隔符
s
是命令,后面的字符是分隔符。
它用于将
s
的“选项”彼此分开

s
有三个选项,一个是要替换的对象(regex),一个是要替换的对象(字符串),另一个是像
g
这样的标志。
您在最后一个位置添加了一个被解释为标志的
/
,但是
/
不是有效的标志。这就是导致错误的原因

echo '/dir1/dir2/usr/local/bin/dir3' | sed 's_/usr/local/bin_/common/bin_/' 
                                            ^^^             ^^          ^^
                                            123             24          25
1: the command
2: the delimieter
3: the first option
4: the second option
5: the flag sed does not understand

当您使用非斜杠作为分隔符时,斜杠对
sed

没有任何特殊意义,因为分隔符是不同的。在2到4中,分隔符是
./
:/
./
?如果是,那么为什么不最终使用它们呢?我想我还没有掌握这种语法的基本用法。使用sed,您可以(几乎)使用任何您想要的分隔符。您可以使用
/
,但也可以使用
。@Mahesha999 nope。分隔符仅为1个字符,这就是为什么代码中有一个尾随
/
的错误,而且这些示例也不尽相同。把/放在_之前,我不会称之为“选项”;第一个是正则表达式,第二个是替换,两者都不是可选的。在结束分隔符之后出现的任何内容都称为“flag”(如用于全局替换的
g
,用于打印模式空间的
p
,用于不区分大小写的匹配的
i
),我将其称为“option”,因为错误消息:
sed:-e expression#1,char 30:s的未知选项
。在“旗帜”上的好捕捉,将添加这一点。