从每个参数中删除尾部斜杠的最简单方法是什么?


Answers:


160

您可以使用此处${parameter%word}详细介绍的扩展。这是一个演示行为的简单测试脚本:

#!/bin/bash

# Call this as:
#   ./test.sh one/ two/ three/ 
#
# Output:
#  one two three

echo ${@%/}

35
+1:要成为高学究的人,它会删除一个斜杠,而不是所有尾随的斜杠。要删除任何数量的斜杠:shopt -s extglob; echo "${@%%+(/)}"
glenn jackman 2012年

24
警告:您可能不想在所有情况下都删除斜杠。如果将“ /”作为参数提供,则删除尾部斜杠将产生...不幸的后果。
戈登·戴维森

13
提示:tr -s /与变量正则表达式结合使用以删除重复的斜杠,然后删除结尾的斜杠。例如DIR=$(echo //some///badly/written///dir////// | tr -s /); DIR=${DIR%/}
Dave

1
真?在bash提示下,运行set -- one///// two// three four/; shopt -s extglob; echo "${@%%+(/)}"并告诉我您看到的内容
glenn jackman 2015年

1
@twalberg我很欣赏“提示”,它们不仅是注释线程中OP问题的替代答案。
凯尔·斯特兰德

38

接受的答案将修剪一个尾随的斜杠。

修剪多个尾斜杠的一种方法是这样的:

VALUE=/looks/like/a/path///

TRIMMED=$(echo $VALUE | sed 's:/*$::')

echo $VALUE $TRIMMED

哪个输出:

/looks/like/a/path/// /looks/like/a/path

1
如果变量包含空格,请不要忘记引用它们: TRIMMED=$(echo "$VALUE" | sed 's:/*$::')
tetsujin

1
实际上,在$()构造内部这不是必需的。但是,它也是无害的:),因此使用双引号可能是一个好习惯,"$VALUE"这样您就不必决定何时以及何时不使用双引号了。
克里斯·约翰逊

有什么办法可以将其与早期捕获相结合?我想从网址中删除协议和(如果存在)尾随斜杠,但echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)/*$|\1|'不起作用(因为我猜捕获组也匹配尾随斜杠)。我可以用两个命令来做:echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)$|\1|' -e 's|/*$||'但是想知道是否可以用一个命令来做?
亚当

对于很大的输入文件,此答案对我来说效果更好。一个简单sed 's:/*$::' < in.txt > out.txt的工作即可在几秒钟内完成
MitchellK


13

realpath解析给定的路径。除其他外,它还删除了斜杠。使用-s防止以下simlinks

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a

1
它要求路径中除最后一个节点外的所有节点都存在。如果用户抛出某些不存在的路径,则将realpath失败。
Livy

2
@Livyrealpath --canonicalize-missing可以正确处理路径的任何不存在部分
maoizm

8

仅供参考,我.bash_profile根据在SO上找到的答案将这两个函数添加到我的函数中。正如克里斯·约翰逊(Chris Johnson)所说,所有使用答案的答案${x%/}都只删除一个斜杠,这些功能将按照他们说的去做,希望这很有用。

rem_trailing_slash() {
    echo "$1" | sed 's/\/*$//g'
}

force_trailing_slash() {
    echo "$(rem_trailing_slash "$1")/"
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.