2016-09-17 150 views
0

我有下划线和点组成的文件名一堆文件的点,这里是一个例子:替换字符串以下划线并使用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或AW ķ将有很大的帮助

+0

那么你想从所有这些删除的文件名完全相同的子串(即'bed.nodup.sortedbed.roadmap.sort.fgwas.gz.')? – redneb

+0

是@redneb,跨文件名重复相同的子字符串。我试图用正则表达式来匹配子字符串 – user2380782

+4

如果你有一个固定的子字符串,你需要什么正则表达式?只要使用子字符串本身作为模式。 – redneb

回答

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

试试这个:

#!/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 
+1

这包含更多的错误,然后有代码行。 google解析ls输出,引用shell变量,regexp元字符,并阅读由Chris Johnson或其他人撰写的Shell脚本食谱。 –

+0

告诉我更多关于错误的知识,以便我学习。 –

+0

不,它们是基本的,所以如果你不知道这些,那么还有很多你也不知道,所以你真的需要阅读某些介绍性的shell编程文本来学习基础知识,而不是只关注这个脚本中有5个左右的错误。你也可以像我说的那样通过Google搜索来找到关于他们中的一些的信息。最后 - 将你的回答与[@ gniourf_gniourf的正确答案](http:// stackoverflow。com/a/39546900/1745001)并注意不同之处。 –

1

请勿使用外部实用程序和正则表达式来完成这样简单的任务!改为使用parameter expansions

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 

注意。我在mv的前面留下了echo,这样没有什么东西会被重命名;这些命令只会显示在您的终端上。如果您对所看到的内容感到满意,请删除echo