我有一堆文件,文件名由下划线和点组成,下面是一个例子:
META_ALL_whrAdjBMI_GLOBAL_August2016.bed.nodup.sortedbed.roadmap.sort.fgwas.gz.r0-ADRL.GLND.FET-EnhA.out.params
我想删除包含.bed.nodup.sortedbed.roadmap.sort.fgwas.gz.
的部分,以便预期的文件名输出为META_ALL_whrAdjBMI_GLOBAL_August2016.r0-ADRL.GLND.FET-EnhA.out.params
我正在使用这些sed命令,但两者都不起作用:
stringZ=META_ALL_whrAdjBMI_GLOBAL_August2016.bed.nodup.sortedbed.roadmap.sort.fgwas.gz.r0-ADRL.GLND.FET-EnhA.out.params
echo $stringZ | sed -e 's/\([[:lower:]]\.[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.\)//g'
echo $stringZ | sed -e 's/\[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.//g'
任何解决方案都是sed或awk会有很多帮助
答案 0 :(得分:1)
不要将外部实用程序和正则表达式用于这么简单的任务!请改用parameter expansions。
;
要执行重命名包含for
的所有文件,请使用以下命令:
stringZ=META_ALL_whrAdjBMI_GLOBAL_August2016.bed.nodup.sortedbed.roadmap.sort.fgwas.gz.r0-ADRL.GLND.FET-EnhA.out.params
echo "${stringZ/.bed.nodup.sortedbed.roadmap.sort.fgwas.gz}"
注意。我将.bed.nodup.sortedbed.roadmap.sort.fgwas.gz
留在shopt -s nullglob
substring=.bed.nodup.sortedbed.roadmap.sort.fgwas.gz
for file in *"$substring"*; do
echo mv -- "$file" "${file/"$substring"}"
done
前面,以便不会重命名任何内容;命令只会显示在您的终端上。如果您对所看到的内容感到满意,请移除echo
。
答案 1 :(得分:0)
你的正则表达式并不比固定模式更普遍,但是如果你想让它工作,你需要在每个点之间允许多个小写字符。现在,您正在寻找一个,但您可以在每个\+
之后使用[[:lower:]]
进行修复
printf '%s' "$stringZ" | sed -e 's/\([[:lower:]]\+\.[[:lower:]]\+\.[[:lower:]]\+\.[[:lower:]]\+\.[[:lower:]]\+\.[[:lower:]]\+\.[[:lower:]]\+\.\)//g'
与
stringZ="META_ALL_whrAdjBMI_GLOBAL_August2016.bed.nodup.sortedbed.roadmap.sort.fgwas.gz.r0-ADRL.GLND.FET-EnhA.out.params"
给我输出
META_ALL_whrAdjBMI_GLOBAL_August2016.r0-ADRL.GLND.FET-EnhA.out.params
答案 2 :(得分:-2)
试试这个:
#!/bin/bash
for line in $(ls -1 META*);
do
f2=$(echo $line | sed 's/.bed.nodup.sortedbed.roadmap.sort.fgwas.gz//')
mv $line $f2
done