3

对我来说,使用 sed 真的很不寻常。我习惯了's/pattern1/pattern2/g'

有人可以帮我解释一下吗?
输入字符串如下所示:

path1/path2/path3/fileA path1/path2/path3/fileB path1/path2/path3/fileC

输出是fileA fileB fileC

4

1 回答 1

13

这是一个使用“,”而不是“/”作为分隔符的替代命令——可能是因为模式中有一个“/”。相当于

s/^.*\///

这表示删除从行首到最后一个正斜杠的所有内容。

当您使用 's' 时,下一个字符用作分隔符。所以你也可以把它写成

s!^.*/!!
s@^.*/@@

ETC

使用不同的分隔符可以避免您在模式中转义分隔符的实例。

您的示例输入:

路径1/路径2/路径3/文件A

' ^' 表示'从字符串的开头',' .*' 表示'匹配任何东西',它是'贪婪的',因此它会尝试匹配尽可能多的字符串。' .*/' 试图贪婪地匹配任何东西,只要它后面跟着一个 '/'。因为它是贪婪的,所以包括其他斜线。所以它匹配path1/path2/path3/。替换模式是'',即什么都没有,所以它有效地删除了从字符串开头到最后一个'/'的所有内容,只留下fileA

TL;DR:意思是“删除路径信息,只留下文件名”

于 2013-11-05T08:25:36.233 回答