2016-09-17 16 views
0

Ich habe eine Reihe von Dateien mit Dateinamen von Unterstrichen und Punkten zusammengesetzt, hier ist ein Beispiel:ersetzen String mit Unterstrich und Punkten sed oder awk mit

META_ALL_whrAdjBMI_GLOBAL_August2016.bed.nodup.sortedbed.roadmap.sort.fgwas.gz.r0-ADRL.GLND.FET-EnhA.out.params 

Ich mag den Teil entfernen, die .bed.nodup.sortedbed.roadmap.sort.fgwas.gz. so enthält die erwartete Dateinamen Ausgang wäre META_ALL_whrAdjBMI_GLOBAL_August2016.r0-ADRL.GLND.FET-EnhA.out.params

ich diese sed Befehle verwende aber keiner funktioniert:

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' 

Jede Lösung wird sed oder aw k würde viel helfen

+0

Also möchten Sie von allen diesen Dateinamen die exakt gleiche Teilzeichenfolge entfernen (d. H. 'Bed.nodup.sortedbed.roadmap.sort.fgwas.gz.')? – redneb

+0

ja @redneb, der gleiche Teilstring wird über Dateinamen wiederholt. Ich habe versucht, eine Regexp verwenden, um die Teilzeichenfolge – user2380782

+4

Wenn Sie eine feste Teilzeichenfolge haben, wofür brauchen Sie die Regex? Verwenden Sie einfach den Teilstring selbst als Muster. – redneb

Antwort

0

Ihre Regex fühlt sich nicht wirklich viel allgemeiner als das feste Muster wäre, aber wenn Sie es funktionieren möchten, müssen Sie mehr als ein Kleinbuchstabe zwischen jedem Punkt zulassen . Gerade jetzt Sie suchen genau ein, aber man kann es beheben mit \+ nach jedem [[:lower:]] wie

printf '%s' "$stringZ" | sed -e 's/\([[:lower:]]\+\.[[:lower:]]\+\.[[:lower:]]\+\.[[:lower:]]\+\.[[:lower:]]\+\.[[:lower:]]\+\.[[:lower:]]\+\.\)//g' 

die mit

stringZ="META_ALL_whrAdjBMI_GLOBAL_August2016.bed.nodup.sortedbed.roadmap.sort.fgwas.gz.r0-ADRL.GLND.FET-EnhA.out.params" 

geben Sie mir den Ausgang

META_ALL_whrAdjBMI_GLOBAL_August2016.r0-ADRL.GLND.FET-EnhA.out.params 
-2

Try this :

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

Dies enthält mehr Fehler als Codezeilen. Google Parsing ls Ausgabe, zitieren Shell-Variablen, Regexp Metazeichen und lesen Sie das Buch Shell Scripting Rezepte von Chris Johnson oder ähnlich. –

+0

Erzähl mir mehr über die Fehler, damit ich lernen kann. –

+0

Nein, sie sind grundlegend, also, wenn Sie diese nicht wissen, dann gibt es viel mehr, Sie wissen auch nicht, und so müssen Sie wirklich lesen, um eine Art einleitenden Shellprogrammierungstext zu lesen, um die Grundlagen zu lernen, anstatt sich nur auf zu konzentrieren die 5 oder so Fehler in diesem Skript. Sie können auch Informationen über einige von ihnen finden, indem Sie einfach googeln, wie ich schon sagte. Schließlich - vergleichen Sie Ihre Antwort mit der korrekten Antwort von [@ gniourf_gniourf] (http: // stackoverflow.com/a/39546900/1745001) und beachten Sie die Unterschiede. –

1

Verwenden Sie keine externen Dienstprogramme und Regexes für solch eine einfache Aufgabe! Verwenden Sie stattdessen 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}" 

Um die Umbenennung aller Dateien ausführen .bed.nodup.sortedbed.roadmap.sort.fgwas.gz enthält, verwenden Sie diese:

shopt -s nullglob 
substring=.bed.nodup.sortedbed.roadmap.sort.fgwas.gz 
for file in *"$substring"*; do 
    echo mv -- "$file" "${file/"$substring"}" 
done 

Hinweis. Ich verließ echo vor mv, so dass nichts umbenannt wird; Die Befehle werden nur auf Ihrem Terminal angezeigt. Entfernen Sie echo, wenn Sie mit dem, was Sie sehen, zufrieden sind.

Verwandte Themen