使用 sed 删除路径字符串的最后一个 /

使用 sed 删除路径字符串的最后一个 /

我尝试使用 sed 替换以下目录结构中的最后一个 / ,但我无法成功。有什么建议么?

输入是/tmp/ABC/Dirs/,输出应该是/tmp/ABC/Dirs

echo " /tmp/ABC/Dirs/"  | sed -r "s/\/(?:[a-zA-Z0-9])/g"

答案1

sed/在这里似乎相当矫枉过正,您可以直接在 Korn shell 中删除尾随(以及类似的 shell,如bash、 以及所有符合 POSIX 标准的 shell,因为 POSIX 已为该实用sh程序指定了 Korn shell 功能):

$ foo=/tmp/ABC/Dirs/
$ echo "${foo%/}"
/tmp/ABC/Dirs

答案2

如果你想使用 with sed,你会这样做:

file=/any/path
sed '$s|/$||' << EOF
$file
EOF

也就是说,删除中存储的路径最后(第一)行/末尾(第二)的字符。对于某些实现,假设非换行符的最大序列的大小(以字节为单位)不超过(通常比系统调用参数中支持的路径的最大大小短)。$$$filesed$fileLINE_MAX

/请注意,对于或的特殊情况//,删除尾随/可能并不理想。/例如,您可能还想删除所有尾随/foo/bar///

所以也许更多先进的一个更合理的理由sed是:

sed '
  ${
    s|\([^/]\)/*$|\1|
    s|^////*|/|
    1b
    s|/*$||
  }' << EOF
$file
EOF

即保留//原样,转和////////,但变成和成。//foo//foo$'foo\n//'$'foo\n'

请注意,这是一个 perl 正则表达式运算符,而不是扩展的正则表达式运算符(由 GNU使用该 GNU 特定选项(?:...)识别)。sed-r

答案3

我是第一个用我的评论回答问题的人s/\/$//

那天其他人有时间提供更全面的答案。

所以今天 - 几天后 - 我发布了一个多余的答案,因为我希望“同侪压力”铜奖从列表中消失。

sed -e s./$..g   # You can golf the quotes and the "\" here

所以请各位好心人这次投反对票直到 -3 :)

答案4

您可以使用 perl 代替 sed:

echo "/tmp/ABC/Dirs/" | perl -pne  "s/\/$//g"

输出

/tmp/ABC/Dirs

相关内容