2010-11-16 16 views
6

मैं एक बैश फ़ाइल में कई पंक्तियों पर एक sed कमांड फैलाने की कोशिश कर रहा हूं। मेरे पास कई पैटर्न हैं जो sed जांचता है और मैं कुछ पैटर्न को लाइन परिवर्तन से अलग करने की उम्मीद कर रहा हूं। यहां मेरी वर्तमान स्क्रिप्ट है जो काम नहीं करती है, सब कुछ एक पंक्ति पर काम करती है लेकिन मैं इसे थोड़ा सा साफ करने और चीजों को विभाजित करने की उम्मीद कर रहा था।एकाधिक पंक्तियों पर 'sed' कमांड

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

किसी भी मदद के लिए धन्यवाद!

+1

क्या "काम नहीं करता है" क्या मतलब है? क्या आपको एक त्रुटि संदेश मिलता है? यह क्या है? क्या आउटपुट आप अपेक्षा करते हैं उससे अलग है? किस तरह से? रिक्त स्थान से बचने और आपके पास जिस तरह से हाइफ़न करना आवश्यक नहीं होना चाहिए। –

उत्तर

6

समस्या इस लाइन पर है:

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

कोई गुम है s/। यह होना चाहिए:

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

मैंने स्थिरता के लिए बैकस्लैश शामिल किया।

इस लाइन //i याद आ रही है:

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

सही किया:

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

त्रुटि संदेश मैं थे मिल गया कि मुझे क्या त्रुटियों के स्रोत के लिए नेतृत्व किया:

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

और

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

यहां इस अधिक पठनीय और पोषणीय बनाने के लिए पर एक सुझाव है:

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

हम्मम्म, शायद उन बेवकूफ त्रुटियों को ठीक कर सकता है। मुझे उसकी जाँच करनी होगी। – Ratty

+0

+1 - कोड का अंतिम भाग एक अच्छा सुझाव है! –

+0

सहायता के लिए धन्यवाद, मैं इसकी सराहना करता हूं, यही वह है जिसे मैं ढूंढ रहा था। धन्यवाद! – Ratty

3

सुनिश्चित नहीं हैं कि अगर मैं तुम्हें समझ में आया, लेकिन आप कुछ इस तरह कर सकते हैं अगर आप सिर्फ एसईडी अभिव्यक्ति की कई पंक्तियों करना चाहते हैं:

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

यह 423 प्रदर्शित करता है, के रूप में उम्मीद।

आप एक पंक्ति में यह चाहते हैं, यह संभव भी है:

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

ही परिणाम देता है।

जो मैं देखता हूं, उसके लिए मैं वास्तव में कई लाइनों में ऐसा करने का सुझाव दूंगा जैसा कि आप पहले से ही कर रहे हैं, बस एक अलग लाइन पर डालें, जैसा कि मुझे लगता है कि यह अधिक पठनीय है। कुछ की तरह:

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

चेक में अधिक जानकारी के लिए इस लिंक:

तहत Quoting multiple sed lines in the Bourne shell

+0

वैसे मैं एक ही कमांड को एक पंक्ति पर शामिल करने की उम्मीद कर रहा था जैसे: sed -e's/\ Xvid \ -Lol // i; एस/\ एक्सवीड \ -Xor // i; s/\ Xvid \ -Notv // i और प्रत्येक व्यक्ति को अलग-अलग विभाजित करने के बजाय समान पैटर्न को अलग करने के लिए सेमी-कोलन का उपयोग करें। यदि मैं कर सकता हूं तो पैटर्न को एक साथ जोड़ना चाहता हूं। – Ratty

संबंधित मुद्दे