如何剪切到最后一个定界符并获取字符串的剩余部分
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.4
、mawk 1.996
、macos nawk
和 gawk 5.1.1
、
上工作
包括 -c/-P/-t/-S
的调用标志
——The 4Chan Teller
我有一个路径 ./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.4
、mawk 1.996
、macos nawk
和 gawk 5.1.1
、
包括 -c/-P/-t/-S
——The 4Chan Teller