美好的一天!
我想知道如何打印以下输出的特定字母:
ls -1 *Mcmm*txt *Mmmm*txt
它给出了:
Mcmm_E.txt
Mcmm_M.txt
Mmmm_E.txt
Mmmm_M.txt
我想获得:
E
M
E
M
提前感谢任何建议
答案 0 :(得分:2)
你可以试试这个。它打印基于_
和.
的最后一个字段作为分隔符(假设您需要在最后_
和.
之间打印所有内容并假设在那里是每个文件名中.
的一个实例)
ls -1 *Mcmm*txt *Mmmm*txt | awk -F'_|\\.' '{print $(NF-1)}'
答案 1 :(得分:2)
ls -1 *Mcmm*txt *Mmmm*txt | cut -b6
打字比使用awk少得多......
cut -b6
选择每行的第6个字节。
答案 2 :(得分:2)
你应该总是避免解析ls
;见here。请改用find
:
find . -type f -name '*M[cm]mm*.txt' -print0
如果你有gnu grep
,你可以输入:
grep -oPz '[^_](?=.txt)'
结果:
E
E
M
M
答案 3 :(得分:1)
另一个awk
ls -1 *Mcmm*txt *Mmmm*txt | awk -F"[_.]" '{print $2}'
E
M
E
M
答案 4 :(得分:1)
不解析ls
的输出。在您的特定情况下,如果您只想打印与您的模式匹配的每个文件名的第六个字符,请执行以下操作:
files_ary=( *Mcmm*txt *Mmmm*txt )
for f in "${files_ary[@]}"; do
printf '%s\n' "${f:5:1}"
done
要仅打印.txt
前面的角色,一个有趣的可能性是:
files_ary=( *Mcmm*.txt *Mmmm*.txt )
for f in "${files_ary[@]%.txt}"; do
printf '%s\n' "${f: -1}"
done
这些方法是100%纯粹的bash,即使文件名(空格,换行符等)中有滑稽符号,它们也能正常工作。哦,为了100%安全,不要忘记使用shopt -s nullglob
的
答案 5 :(得分:0)
ls -1 *Mcmm*txt *Mmmm*txt | sed -u "s/^.\{5\}\(.\).*/\1/"
-u用于流处理(avoir缓存在巨大的文件夹上)
我认为cut
会更快
在这种情况下,即使在ls
中使用*,也不会处理第一个字符