2012-09-03 11 views
6

मैं sed के साथ एक डालने की कोशिश कर रहा हूं (केवल इसे पढ़ने के बाद) और मुझे कई लाइनों को सम्मिलित करने की कोशिश करके स्टंप किया जा रहा है?सेड एकाधिक लाइन्स डालें

क्या मैं वर्तमान में कर रहा हूँ है:

sed -i "${line} i\ 
     /* Name - ID */ \ 
     select @ID = NULL \ 
     from Animals \ 
     where VrsnID = @VrsnID \ 
     and  Request= \"Request\" \ 
\ 
" animalNames.txt 

नोट echo $line == 131

नई समस्या

सब कुछ उत्पादन में एक पंक्ति में दिखाई दे? (यह भी पहले मांगपत्र लापता)

/* Name - ID */  select @ID = NULL   from Animals   where VrsnID = @VrsnID   and  Request= "Request" 

हल

लेकिन इस फेंकता है:

sed: -e expression #1, char 47: unknown command: ` 
' 

किसी भी विचार क्यों?

अपना समय

+0

कौन सा एसईडी के संस्करण आप प्रयोग करते हैं? जीएनयू/बीएसडी? – Zulu

+0

जीएनयू क्षमा करें कि एक अलग –

+0

बनाया गया है, जीएनयू sed संस्करण 4.2.1 – Thor

उत्तर

4

नई मुसीबत के लिए के लिए धन्यवाद: डबल बैकस्लैश \\

+0

कमाल का धन्यवाद, मैं इसे Google में कहीं भी क्यों नहीं ढूंढ सकता था ("sed एकाधिक लाइन डालने" के लिए 20+ खोजों को बनाना चाहिए) –

+1

क्योंकि मल्टीलाइन के लिए एडब्ल्यूके का उपयोग करना बेहतर है। (मेरी राय में) – Zulu

+0

एक तरफ नोट पर, क्या सीएंडपी के बजाय "कमांड" डालने के लिए फाइल को पढ़ना संभव है? –

11

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

$ echo "foo\ 
> bar" 
foobar 
$ echo "foo 
> bar" 
foo 
bar 

आप इसे पहले एक और बैकस्लैश रख कर एक बैकस्लैश और sed करने के लिए एक नई पंक्ति बैकस्लैश गुजरती हैं, तो बचने के लिए की जरूरत है।

sed -i "${line} i\\ 
     /* Name - ID */ \\ 
     select @ID = NULL \\ 
     from Animals \\ 
     where VrsnID = @VrsnID \\ 
     and  Request= \"Request\" \\ 

" animalNames.txt 

यह अगर आप एक here document के रूप में मानक इनपुट पर स्क्रिप्ट पारित अधिक पठनीय हो सकता है। आपको ${line} विकल्प पर विस्तार छोड़ना होगा, इसलिए आपको अभी भी बैकस्लैश को दोगुना करना होगा।

sed -i -f - animalNames.txt <<EOF 
${line} i\\ 
     /* Name - ID */ \\ 
     select @ID = NULL \\ 
     from Animals \\ 
     where VrsnID = @VrsnID \\ 
     and  Request= "Request" \\ 

EOF 
+0

सभी जानकारी गिल्स के लिए धन्यवाद! हेरेडोक संस्करण के लिए –

+0

+1। विभिन्न महत्वपूर्ण मेटा वर्णों और उद्धरणों वाली कई पंक्तियों के साथ काम करने वाली इनलाइन कमांड प्राप्त करने के लिए संघर्ष कर रहा था। यह विधि पूरी तरह से पहली बार काम करती है, और यह बहुत साफ है, इसलिए भविष्य में मेरा गोटो होगा। – randomsock

1

यह आप के लिए काम कर सकते हैं:

sed ${line}'i\ 
    /* Name - ID */ \ 
    select @ID = NULL \ 
    from Animals \ 
    where VrsnID = @VrsnID \ 
    and  Request= \"Request\" 

' animalNames.txt 
+0

आपको मेरे लिए एक नई लाइन –

+0

@PezCuckow (जीएनयू sed और bash का उपयोग करके) के लिए \\ का उपयोग करने की आवश्यकता है \ n पर्याप्त है। – potong

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