我的目录中有一组 .csv 文件,例如
abc_q1_w1.csv
defg_q11_w2.csv
hijk_q11_w3.csv
我想编写一个脚本来提取部分文件名并将它们放入列中,即
abc q1 w1
defg q11 w2
hijk q11 w3
有谁知道如何使用 bash 脚本实现这种文件名提取?
答案1
你可以使用类似的东西:
ls -1 | tr '_' '\t'
答案2
使用 sed
$ printf "%s\n" * | sed 's/.csv$//; s/_/\t/g'
abc q1 w1
defg q11 w2
hijk q11 w3
怎么运行的:
printf "%s\n" *
每行打印一个文件名s/.csv$//
删除尾随的.csv
.s/_/\t/g
将 转换_
为制表符。
使用bash
$ for f in *; do f="${f%.csv}"; printf "%s\n" "${f//_/$'\t'}"; done
abc q1 w1
defg q11 w2
hijk q11 w3
如果有助于清晰起见,上面的代码可以分为多行:
for f in *
do
f="${f%.csv}"
printf "%s\n" "${f//_/$'\t'}"
done
${f%.csv}
删除尾随.csv
并将${f//_/$'\t'}
所有转换_
为制表符。
我们不使用echo
此任务,因为如果其中一个文件名以 开头-
,许多 shell 会尝试将该文件名解释为选项,结果不会很好。
从不同的目录运行代码
$ for f in "$dir"/*; do f="${f#$dir/}"; f="${f%.csv}"; printf "%s\n" "${f//_/$'\t'}"; done
abc q1 w1
defg q11 w2
hijk q11 w3