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的未知选项
。在“旗帜”上的好捕捉,将添加这一点。