例如,我有很多文件看起来像下面的输出,我试图获取所有唯一文件名的列表,但忽略“-”右侧的字符。我已经尝试了ls -la | grep ....- | sort --unique一些变化,但这并没有给出我需要的输出
4855-00160880.psi
4855-00160980.ps
4855-00160980.psi
5355-00160880.ps
5355-00160880.psi
5355-00160980.ps
5355-00160980.psi
5855-00160880.ps
5855-00160880.psi
5855-00160980.ps
5855-00160980.psi
5855-00160A80.ps
5855-00160A80.psi
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望输出显示类似
4855
5355
5855
Run Code Online (Sandbox Code Playgroud)
因为你真的不想解析ls,所以这应该可以解决问题:
find . -type f -maxdepth 1 -exec basename "{}" \; | cut -d'-' -f1 | sort -u
Run Code Online (Sandbox Code Playgroud)
这个怎么样?
printf "%-4.4s\n" ????-* | uniq
Run Code Online (Sandbox Code Playgroud)
Shell 按字母顺序扩展通配符并将结果作为参数传递给printf。格式字符串将每个参数截断为四个字符并添加一个换行符。现在剩下的就是删除相邻的重复项。
如果您不知道连字符前的位数,但您有想法,则可以遍历一些候选项:
for expr in '??' '???' '????' '?????' # Quoted (!)
do
printf "%-${#expr}.${#expr}\n" $expr-* | # Unquoted!
uniq
done
Run Code Online (Sandbox Code Playgroud)
这使用 Bash-only参数扩展 $[#var},它获得 的字符串长度$var。
请注意引用通配符以避免在循环初始化中扩展的技巧,然后在循环内使用未引用的变量(在大多数其他情况下这是禁忌)。