假设您有一组文件:
a_1 a_2 a_3
b_1 b_2 b_3
c_1 c_2 c_3
有没有办法通过命令外壳列出每个字符串的一部分并且只列出一次,即:a、b、c?
我知道你可以把它列出来
a_1, b_1, c_1
但我希望它只列出字符串的第一部分。
假设您有一组文件:
a_1 a_2 a_3
b_1 b_2 b_3
c_1 c_2 c_3
有没有办法通过命令外壳列出每个字符串的一部分并且只列出一次,即:a、b、c?
我知道你可以把它列出来
a_1, b_1, c_1
但我希望它只列出字符串的第一部分。
Unix shell 由于其管道设计而非常强大。
没有一个ls
选项可以满足您的要求(我知道),但是使用管道构建解决方案非常容易。
ls | awk '{print sub(/_.*/, "", $0); print $0}' | sort -u
| | | |
| | | > sorts output and makes it unique
| | > prints what is left of each line, after sub
| > sub(...) turns a_...., into just 'a', etc
> create you list of files
抱歉,现在没有时间为此构建测试。如果您遇到语法错误,请发表评论,我会尝试修复代码。
/_.*/
这里非常“nard-coded”的一件事是将要删除的正则表达式。这意味着,“找到'_'字符,然后是之后的所有字符”,然后“将它们替换为""
”中的值,在这种情况下是空字符串,有效地删除了单词的后缀部分。(试着把"x"
而不是仅仅""
为了明白我的意思)。
如果您的文件列表不像您的示例那么简单,您可能需要创建一个新的 reg-exp 来替换您想要删除的后缀部分。
如果您不熟悉管道,可以很容易地进行实验,一次添加一个管道集,以查看每个步骤如何修改输出。IHTH
Try doing this :
cd /path/where/files/exists
printf -- '%s\n' a_[1-3] b_[1-3] c_[1_3]
or
cd /path/where/files/exists
ls -l a_[1-3] b_[1-3] c_[1_3]
or anything you want with the globs