删除 bash 变量中最后一个斜杠之前的所有内容

删除 bash 变量中最后一个斜杠之前的所有内容

我在 bash 中有一个变量,myVar其中包含一个长字符串,如下所示:

-rw-rw-rw- root/root 16 2018-02-12 10:03 foo_tar/baz1234_

我想删除myVar最后一个斜杠之前的所有内容(包括最后一个斜杠),这样myVar最终只存储baz1234_.如何删除所有内容并将结果存储在变量中?

我遇到过处理 sed 的解决方案,但这些解决方案处理文件处理,因此是我的问题。

答案1

你应该使用bash 参数扩展为此并使用类型的子字符串删除${PARAMETER##PATTERN}

从一开始就 -${PARAMETER##PATTERN}

这种形式是从字符串的开头删除试图匹配它的所描述的模式。他们##尝试使用最长的文本匹配来做到这一点。

用于您的示例

$ myVar='-rw-rw-rw- root/root 16 2018-02-12 10:03 foo_tar/baz1234_'
$ echo "${myVar##*/}"
baz1234_

正如评论中所指出的,有问题的字符串似乎是ls变量中命令的输出!这不是理想的脚本编写方式。更清楚地解释您的要求。

答案2

awk解决方案:

myVar='-rw-rw-rw- root/root 16 2018-02-12 10:03 foo_tar/baz1234_'
myVar=$(echo "$myVar" |  awk -F '/' '{print $NF}')

然而,正如其他人指出的那样,将 ls 的输出存储为变量并不是一个好主意 - 如果您可以为脚本提供更多上下文,我们应该能够建议更好的解决方案

答案3

来自评论:

我有一个充满 tar 档案的文件夹,每个文件夹都包含多个文件。我循环遍历它们以获得以 baz 开头的特定文件,后跟一些数字,最后带有下划线 _

那么这是列出的输出tar tzvf foo.tar.gz还是这样的?我仅输出带有(不带详细信息)tar的文件名,因此您可以执行类似的操作来获取文件名,而不是使用 shell 逐行处理输出:tar t ...v

tar tzf foo.tar.gz |grep -E '/baz[0-9]+_$' |sed -e 's,.*/,,'

(或者通过命令替换捕获它:filename=$(tar ... | sed ...)当然,您可以sed用参数扩展替换${filename##./}。)

相关内容