命令行中如何从ls输出排除特定符号?含文件名处理示例
命令行提取文件名指定部分的方法
需求1:提取nameX格式的文件名(去除前缀数字+下划线与后缀.pdf)
针对01_name1.pdf这类文件名,可通过以下几种命令行方式提取中间的name1部分:
方法1:Bash参数扩展
利用Bash的字符串截取特性,分步移除不需要的内容:
for file in *.pdf; do trimmed="${file#*_}" # 移除从开头到第一个下划线的内容,得到name1.pdf echo "${trimmed%.pdf}" # 移除末尾的.pdf后缀,得到name1 done
方法2:Sed正则替换
通过正则匹配捕获目标内容:
ls *.pdf | sed 's/^.*_\(.*\)\.pdf/\1/'
解释:正则^.*_\(.*\)\.pdf匹配整个文件名,仅保留_和.pdf之间的内容作为输出。
方法3:Awk字段分割
以下划线和点作为分隔符,直接提取目标字段:
ls *.pdf | awk -F '[_.]' '{print $2}'
解释:-F '[_.]'指定分隔符为_或.,文件名会被分割为01、name1、pdf三个字段,打印第二个字段即可。
需求2:仅排除文件名前3个字符
如果只需要移除文件名的前3个字符(比如将01_name1.pdf转为name1.pdf),可使用以下方法:
方法1:Bash参数扩展
利用字符串偏移截取从第4个字符开始的内容:
for file in *.pdf; do echo "${file:3}" done
解释:${file:3}表示从索引3(Bash字符串索引从0开始)的位置截取到末尾。
方法2:Sed正则替换
匹配开头3个任意字符并替换为空:
ls *.pdf | sed 's/^...//'
解释:^...匹配字符串开头的3个任意字符,替换后即得到移除前3个字符的结果。
内容的提问来源于stack exchange,提问作者kubrickian
相关产品推荐
相关产品推荐

