我尝试使用 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
也就是说,删除中存储的路径最后(第一)行/
末尾(第二)的字符。对于某些实现,假设非换行符的最大序列的大小(以字节为单位)不超过(通常比系统调用参数中支持的路径的最大大小短)。$
$
$file
sed
$file
LINE_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