我sed 's=.*/=='
在sh脚本的上下文中看到了,我很困惑。我不能在sed手动或网络搜索(对于找到sed s=
如何)s
时,不s///
。除了s
我在这里只看到一个潜在的命令=
(打印当前输入行号)外,在这种情况下,其余的工作...
在shell中运行命令会产生与输入相同的输出,例如echo 'jkfdsa=335r34'
,但是echo 'jkfdsa=335r34' | sed 's/=.*/==/'
会按照手册进行替换。还稍微修改了命令,例如echo 'jkfdsa=3' | sed 's798=.*/==/'
给
sed: -e expression #1, char 11: unterminated 's' command
,所以原始的应该有一些正确的含义。它是什么?
该=
是替代分隔符。使用这些是因为该模式包含一个/
(这是更常用的定界符)。几乎任何字符都可以用作替代定界符,因此s@.*/@@
或s_.*/__
将具有相同含义。使用普通定界符,该sed
表达式可能被编写为
s/.*\///
(/
表达式要匹配的文字需要在此处转义),或者可能更具可读性,
s/.*[/]//
([...]
字符类中的大多数字符都是文字1)
该sed
表达式的作用是替换所有不匹配.*/
的内容。这将具有删除/
行中最后一个字符(包括该字符)之前的所有内容的作用。由于贪婪地匹配任何字符的任何序列,因此它将删除最后一个 /
(而不是第一个).*
。
例子:
$ echo 'a/b/c' | sed 's/.*[/]//'
c
unterminated 's' command
测试时遇到的错误
s798=.*/==/
是由于7
用作s
命令的分隔符。表达方式
s7.*/77
本来可以的。
1 ...除了具有内特殊含义的字符[...]
本身^
(在开始时)和-
(当未第一,第二后^
,或最后一个)。内的字符[
和]
也需要特殊处理[...]
,但这超出了此问题的范围。
如果使用此命令在某个字符串或shell变量中的路径末尾获取文件名,则该basename
实用程序可能会做得更好(如果路径以斜杠结尾也可以做正确的事情):
$ basename a/b/c
c
$ basename a/b/c/
c
同样,${variable##*/}
假设变量不包含换行符,则标准Shell参数替换的效果等同于$variable
通过sed
命令替换将上述值传递给上述表达式,但速度要快许多倍。
变量替换和basename
实用程序还可以正确处理包含换行符的路径名,sed
而不会这样做(因为它逐行处理其输入)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句