我在 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##./}
。)