2010-11-16 16 views
6

Próbuję rozprzestrzeniać jedną komendę sed na kilka linii w pliku bash. Mam wiele wzorców, na które sprawdza sed i mam nadzieję oddzielić niektóre wzorce od zmiany linii. Oto mój obecny skrypt, który nie działa, wszystko działa na jednej linii, ale miałem nadzieję, że trochę go posprzątam i podzielę.Rozprzestrzenianie polecenia "sed" na wielu liniach

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

Dzięki za pomoc!

+1

Co to znaczy "nie działa" oznacza? Czy otrzymujesz komunikat o błędzie? Co to jest? Czy wyniki różnią się od oczekiwanych? W jaki sposób? Nie powinno być konieczne ucieczkę z przestrzeni i łączenie się z tym, co masz. –

Odpowiedz

6

Problem polega na tym wierszu:

-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' \ 

Brakuje s/. Powinno być:

-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' \ 

Zawarłem odwrócony ukośnik dla uzyskania spójności.

Linia brakuje //i:

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

Poprawiono:

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

komunikaty o błędach Dostałem były tym, co doprowadziło mnie do źródła błędów:

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

i

sed: -e expression #4, char 51: unterminated `s' command 

Oto propozycja jak zrobić to bardziej czytelne i utrzymaniu:

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, może poprawienie tych głupich błędów może być problemem. Będę musiał to sprawdzić. – Ratty

+0

+1 - ostatni fragment kodu to świetna propozycja! –

+0

Dzięki za pomoc, doceniam to, tego właśnie szukałem. Dzięki! – Ratty

3

Nie wiem, czy ja zrozumiałem, ale można zrobić coś takiego, jeśli chcesz po prostu mieć wiele wierszy wyrażeń sed:

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

Wyświetla 423, jak oczekiwano.

Jeśli chcesz go w jednej linii, to jest możliwe, zbyt:

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

daje ten sam rezultat.

Za to, co widzę, sugerowałbym robienie tego w wielu liniach, jak już to robisz, po prostu umieszczając każdy znak -e w osobnej linii, ponieważ uważam, że jest bardziej czytelny. Coś jak:

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

Sprawdź ten link, aby uzyskać więcej informacji:

pod Quoting multiple sed lines in the Bourne shell

+0

Cóż, miałem nadzieję dołączyć te same polecenia w jednym wierszu, jak: sed -e 's/\ Xvid \ -Lol // i; s/\ Xvid \ -Xor // i; s/\ Xvid \ -Notv // i ORAZ używa średnika do oddzielania podobnych wzorów zamiast dzielenia każdego z nich osobno. Próbuję sparować wzory, jeśli to możliwe. – Ratty

Powiązane problemy