2010-11-16 3 views
6

Tôi đang cố gắng truyền một lệnh sed trên một vài dòng trong một tệp bash. Tôi có nhiều mẫu mà sed kiểm tra và tôi hy vọng sẽ tách một số mẫu bằng một thay đổi dòng. Đây là kịch bản hiện tại của tôi không hoạt động, đặt tất cả mọi thứ trên một dòng hoạt động nhưng tôi đã hy vọng chỉ cần làm sạch nó lên một chút và chia nhỏ mọi thứ.Truyền lệnh 'sed' qua nhiều dòng

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

Cảm ơn bạn đã được trợ giúp!

+1

"Không hoạt động" có nghĩa là gì? Bạn có nhận được một thông báo lỗi? Nó là gì? Sản lượng có khác với những gì bạn mong đợi không? Bằng cách nào? Nó không phải là cần thiết để thoát khỏi không gian và dấu gạch nối theo cách bạn có. –

Trả lời

6

Vấn đề là trên dòng này:

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

Có thiếu s/. Nó phải là:

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

Tôi bao gồm dấu gạch chéo ngược cho tính nhất quán.

Dòng này là mất tích //i:

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

Corrected:

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

Các thông báo lỗi tôi đã là gì dẫn tôi đến nguồn gốc của các lỗi:

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

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

Dưới đây là một gợi ý về cách làm này dễ đọc hơn và dễ bảo trì:

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, có thể sửa những lỗi ngu ngốc đó có thể là vấn đề. Tôi sẽ phải kiểm tra điều đó. – Ratty

+0

+1 - đoạn mã cuối cùng là một gợi ý tuyệt vời! –

+0

Cảm ơn sự giúp đỡ, tôi đánh giá cao nó, đó là những gì tôi đang tìm kiếm. Cảm ơn! – Ratty

3

Không chắc chắn nếu tôi hiểu bạn, nhưng bạn có thể làm một cái gì đó như thế này nếu bạn chỉ muốn có nhiều dòng biểu thức sed:

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

này hiển thị 423, như mong đợi.

Nếu bạn muốn nó trên cùng một dòng, đó là có thể, quá:

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

cho kết quả tương tự.

Đối với những gì tôi thấy, tôi thực sự khuyên bạn nên thực hiện nó theo nhiều dòng như bạn đã làm, chỉ cần đặt mọi dòng trên một dòng riêng biệt, vì tôi nghĩ điều đó dễ đọc hơn. Một cái gì đó như:

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

Kiểm tra liên kết này để biết thêm thông tin:

dưới Quoting multiple sed lines in the Bourne shell

+0

Tôi cũng hy vọng sẽ bao gồm các lệnh giống nhau trên một dòng như: sed -e 's/\ Xvid \ -Lol // i; s/\ Xvid \ -Xor // i; s/\ Xvid \ -Notv // i VÀ sử dụng dấu chấm phẩy để tách các mẫu tương tự thay vì tách riêng từng mẫu. Đang cố ghép các mẫu lại với nhau nếu tôi có thể. – Ratty