如何剪切到最后一个定界符并获取字符串的剩余部分

How to cut till the last delimiter and get remaining part of a string

我有一个路径 ./test/test1,我需要提取 test1 部分。

我可以用

cut -d '/' -f 3

但我也可能有像 ./test/test1/test1a 这样的路径,在这种情况下我需要提取 test1a 部分。

我可以通过切换 2、3、4 来满足我的需要,以类似的方式执行此操作。

但是如果我有一个包含一些路径的列表,我该如何实现呢。

./test/test1
./test/test1/test1a/
./test/test1/test1a/example

如何始终确保在最后一个 / 定界符之后提取字符串的最后部分?如何从最后一个字符串开始剪切到分隔符?

编辑:预期输出:

test1
test1a
example
path=./foo/bar/baz

basename "$path"

# or pure shell:
echo "${path##*/}"

两者都 return baz。对方,dirname,returns ./foo/bar.

您可以使用 awk 在最后一个分隔符后轻松剪切,如您在此处所见:

cat conf.conf.txt | awk -F "/" '{ print $NF}'

(供您参考:awk 中的 NF 代表“字段数”。)

但是,由于第二行以斜杠结尾,因此第二个结果将为空,如您在此处所见:

test1

example

这是你想要的吗?

“列表”的含义并不完全清楚。也许你有一个数组中的路径,或者只是一个 space 分隔的字符串。在任何一种情况下,您都可以使用 basename,但您将使用它的方式取决于数据。如果你有一个 space 分隔的字符串,你可以只使用:

$ cat a.sh
#!/bin/sh

list='./test/test1
./test/test1/test1a/
./test/test1/test1a/example'

basename -a $list
$ ./a.sh
test1
test1a
example

如果任何名称中包含 IFS 中的字符,该表单将失败。如果你的名字在一个数组中,处理这个问题会稍微容易一些:

#!/bin/sh

list=('./test/with space/test1'
./test/test1/test1a/
./test/test1/test1a/example)

basename -a "${list[@]}"

清理 one-liner 解决方案:

<<<"${test2}" mawk -F/ '$!_=$-_=$(NF-=_==$NF)' 

test1
test1a
example

测试并确认在 mawk-1.3.4mawk 1.996macos nawkgawk 5.1.1

上工作

包括 -c/-P/-t/-S

的调用标志

——The 4Chan Teller