2010-11-16 21 views
6

Ich versuche, einen sed Befehl über mehrere Zeilen in einer Bash-Datei zu verbreiten. Ich habe mehrere Muster, nach denen sed sucht, und ich hoffe, einige der Muster durch eine Linienänderung zu trennen. Hier ist mein aktuelles Skript, das nicht funktioniert, alles auf einer Zeile funktioniert, aber ich hatte gehofft, es einfach ein wenig aufzuräumen und die Dinge aufzuteilen.Spread 'Sed' Befehl über mehrere Zeilen

#!/bin/sh -f 

#files=$(ls -1 | egrep '.avi|.mkv'); 

#echo $files 
for f in *.mkv *.avi; 
do 
    renF=`echo $f | tr '.' ' ' | sed -e 's/ \([^ ]*\)$/.\1/; s/\ \[sharethefiles\ com\]//i' \ 
    -e 's/\ x264\-Ctu//i; s/\ x264\-Bia//i; s/\ x264\-Fov//i' \ 
    -e 's/\ Xvid\-Lol//i; s/\ Xvid\-Xor//i; s/\ Xvid\-Notv//i; s/\ Xvid\-Fqm//i; s/\ Xvid\-p0w4//i; Xvid\-BIA//i; s/\ Xvid\-Chgrp//i; s/\ Xvid\-Fov//i' \ 
    -e 's/\ PDTV\-Fov//i; s/\ PDTV\-River//i; s/\ PDTV\-Sfm' \ 
    -e 's/\ Dts\-Chd//i; s/\ WEB\-DL//i; s/\ H264\-SURFER//i' \ 
    -e 's/\ Dsr//; s/\ WS//i; s/\ PDTV//i; s/\ X264//i; s/\ Blu\-Ray//; s/\ Bdrip//i; s/\ Bluray//i; s/\ HDTV//i; s/\ DTS//i; s/\ AC3//i; s/\ Dd5//i; s/\ Dualaudio//i; s/\ AAC2//i; s/\ XVID//i'` 
    #echo $renF 
    if [ "$f" == "$renF" ]; then 
     echo "FileName already cleaned." 
    else 
     mv "$f" "$renF" 
    fi 
done 

Danke für jede Hilfe!

+1

Was bedeutet "nicht funktioniert" bedeuten? Erhalten Sie eine Fehlermeldung? Was ist es? Unterscheidet sich die Ausgabe von dem, was Sie erwarten? Inwiefern? Es sollte nicht notwendig sein, den Leerstellen und Bindestrichen auf die gleiche Weise zu entkommen. –

Antwort

6

Das Problem ist auf dieser Linie:

-e 's/\ Xvid\-Lol//i; s/\ Xvid\-Xor//i; s/\ Xvid\-Notv//i; s/\ Xvid\-Fqm//i; s/\ Xvid\-p0w4//i; Xvid\-BIA//i; s/\ Xvid\-Chgrp//i; s/\ Xvid\-Fov//i' \ 

Es gibt eine fehlende s/. Es sollte sein:

-e 's/\ Xvid\-Lol//i; s/\ Xvid\-Xor//i; s/\ Xvid\-Notv//i; s/\ Xvid\-Fqm//i; s/\ Xvid\-p0w4//i; s/\ Xvid\-BIA//i; s/\ Xvid\-Chgrp//i; s/\ Xvid\-Fov//i' \ 

Ich habe den Backslash für die Konsistenz enthalten.

Diese Zeile //i fehlt:

-e 's/\ PDTV\-Fov//i; s/\ PDTV\-River//i; s/\ PDTV\-Sfm 

Korrigiert:

-e 's/\ PDTV\-Fov//i; s/\ PDTV\-River//i; s/\ PDTV\-Sfm//i 

Die Fehlermeldungen I Were bekam, was an die Quelle des Fehlers führte mich:

sed: -e expression #3, char 93: unknown command: `X' 

und

Hier ist ein Vorschlag, wie diese besser lesbar zu machen und wartbar:

while read -r pattern 
do 
    sedscript+="$pattern;" 
done <<EOF 
s/ \([^ ]*\)$/.\1/ 
s/\ \[sharethefiles\ com\]//i 
s/\ x264\-Ctu//i 
s/\ x264\-Bia//i 
... 
s/\ XVID//i 
EOF 

renF=$(echo $f | tr '.' ' ' | sed -e "$sedscript") 
+0

Hmmmm, vielleicht korrigieren diese dummen Fehler vielleicht das Problem. Ich werde das überprüfen müssen. – Ratty

+0

+1 - das letzte Stück Code ist ein großer Vorschlag! –

+0

Danke für die Hilfe, ich schätze es, das ist, was ich gesucht habe. Vielen Dank! – Ratty

3

nicht sicher, ob ich dich verstanden, aber man kann so etwas tun, wenn Sie nur mehrere Zeilen sed Ausdrücke haben wollen:

v=`echo 123|sed 's/1/2/ 
s/2/3/ 
s/3/4/'`; echo $v 

Dies zeigt 423, wie erwartet.

Wenn Sie es auf einer Linie wollen, ist das möglich, auch:

v=`echo 123|sed 's/1/2/ ; s/2/3/ ; s/3/4/'`; echo $v 

das gleiche Ergebnis.

Für das, was ich sehe, würde ich tatsächlich vorschlagen, es in mehreren Zeilen zu tun, wie Sie bereits tun, nur alle -e auf eine separate Zeile setzen, wie ich denke, dass das lesbarer ist. Etwas wie:

v=`echo 123|sed \ 
    -e 's/1/2/' \ 
    -e 's/2/3/' \ 
    -e 's/3/4/'` 
echo $v 

Überprüfen Sie diesen Link für weitere Informationen:

unter Quoting multiple sed lines in the Bourne shell

+0

Nun, ich hatte gehofft, die gleichen Befehle in einer Zeile enthalten wie: sed -e 's/\ Xvid \ -Lol // i; s/\ Xvid \ -Xor // i; s/\ Xvid \ -Notv // i UND verwenden Sie das Semikolon, um ähnliche Muster zu trennen, anstatt sie einzeln aufzuteilen. Versuche, die Muster miteinander zu paaren, wenn ich kann. – Ratty