使用sed或awk用下划线和点替换字符串

时间:2016-09-17 10:40:38

标签: regex bash awk sed

我有一堆文件,文件名由下划线和点组成,下面是一个例子:

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会有很多帮助

3 个答案:

答案 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