2012-05-25 11 views
13

मैं इसे डबल इसएसईडी या एडब्ल्यूके के साथ लाइन में डबल कोट्स कैसे जोड़ें?

"name,id,3" 

मैं कोशिश की है एसईडी के /.*/ \ "& \"/जी 'की तरह उद्धृत की है, शब्द

name,id,3 

मैं की जरूरत है की एक सूची है, मिल गया

"name,id,3 

केवल एक दोहरे उद्धरण

मैं भी awk की कोशिश की है {प्रिंट "\" "$ 1" \ ""}, ठीक उसी परिणाम के साथ

+1

आपका sed कमांड मेरे कंप्यूटर पर काम करता है। आप डबल कोट्स से पहले बैकस्लैश को छोड़ सकते हैं क्योंकि वे एक उद्धृत स्ट्रिंग में बेकार हैं। – Scharron

+0

हम्म, हाँ, यह अजीब है। मुझे एक डबल कोट मिलता है। मेरी मूल फ़ाइल file.csv है - "नाम, आईडी, [[: num:]]" की एक लंबी सूची है। यह क्यों काम नहीं करता है? – minerals

+1

'जी' आवश्यक नहीं है, लेकिन यह आपकी समस्या का कारण नहीं है। आपका मंच क्या है? –

उत्तर

8

आपका इनपुट फ़ाइल पंक्तियों के अंत में कैरिएज रिटर्न है। उन्हें हटाने के लिए आपको फ़ाइल पर dos2unix का उपयोग करने की आवश्यकता है। या आप यह कर सकते हैं:

sed 's/\(.*\)\r/"\1"/g' 

जो कैरिज रिटर्न को हटा देगा और उद्धरण जोड़ देगा।

+0

के लिए धन्यवाद, जो काम करता है! आप सही हैं, फ़ाइल विंडोज़ से आती है और विंडोज़ में जेनरेट की गई थी – minerals

+0

महान समाधान! क्या आप डाल सकते हैं \ r और "\ 1" यहां कुछ प्रकाश क्या कर रहा है? –

+0

@satch_boogie: '\ r' एक कैरिज रिटर्न है। '\ 1' कोष्ठक द्वारा किए गए कैप्चर की सामग्री है (इसलिए इस मामले में, कैरिज रिटर्न से पहले पूरी लाइन)। नतीजा यह है कि कैरिज रिटर्न हटा दिया गया है और उद्धरण जोड़े गए हैं। मुझे लगता है कि अंत में 'जी' (वैश्विक) अनावश्यक है, लेकिन मेरे जवाब ने ओपी के सवाल से इसे संरक्षित किया। समूहों को कैप्चर करने के बारे में अधिक जानकारी के लिए [यह] (http://www.regular-expressions.info/brackets.html) देखें। –

11

में इस पाइप के रूप में उपयोग की आवश्यकता है:

sed 's/^/"/;s/$/"/' 

^ लाइन शुरू करने और $ लंगर के लिए लंगर है लाइन अंत के लिए। sed लाइन के साथ हम क्रमशः " और " के साथ लाइन प्रारंभ और लाइन अंत को बदल रहे हैं।

उदाहरण:

$ echo -e "name,id,2\nname,id,3\nname,id,4"|sed 's/^/"/;s/$/"/' 
"name,id,2" 
"name,id,3" 
"name,id,4" 
sed बिना

:

$ echo -e "name,id,2\nname,id,3\nname,id,4" 
name,id,2 
name,id,3 
name,id,4 

आपकी फ़ाइल डॉस लाइन अंत है लगता है। dos2unixपहले के माध्यम से इसे पाइप करें।

सबूत:

$ cat test.txt 
name,id,2 
name,id,3 
name,id,4 
$ sed 's/^/"/;s/$/"/' test.txt 
"name,id,2 
"name,id,3 
"name,id,4 
$ cat test.txt|dos2unix|sed 's/^/"/;s/$/"/' 
"name,id,2" 
"name,id,3" 
"name,id,4" 
+0

मुझे आपको वैरिएंट पसंद है, लेकिन यह मुझे सिर्फ "नाम, आईडी, 3 बिना दूसरे डबल कोट ट्राइड सेड्स/$ /"/'देता है, आउटपुट वही है!"नाम, आईडी, 3 इस फ़ाइल के साथ कुछ गड़बड़ है – minerals

+0

@ user1413424: आप वास्तव में इसका आविष्कार कैसे कर रहे हैं? इसके ऊपर के सटीक आदेश के साथ ** ** ** काम करेगा। सवाल यह है कि आप किस शैल का उपयोग कर रहे हैं और आप कैसे हैं इसका आविष्कार करना, क्योंकि कुछ विशेष पात्र (जैसे '$') निगल सकते हैं। – 0xC0000022L

+0

~/साझा $ sed's/^/"/; s/$ /"/'file.csv – minerals

7

आप awk उपयोग कर सकते हैं के बजाय इस तरह sed:

printf '"%s"\n' $line 
+2

'printf' का क्रिएटिव उपयोग। +1! – 0xC0000022L

+0

धन्यवाद, अच्छा लगता है – minerals

+0

मेरे पास यह आदेश है, लेकिन मुझे प्रत्येक आउटपुट लाइन को "" के अंदर संलग्न करने की आवश्यकता है। इस कमांड को कैसे संशोधित करें? : awk '{के लिए (i = 2; i <= एनएफ; i ++) {printf ("% s", $ i); } printf ("\ n")} 'all.txt> result.txt – user3823859

3

सबसे आसान तरीका मैंने पाया हेक्स उपयोग करने के लिए है:

line='name,id,3' 
echo $line | awk '{printf("\"%s\"\n", $0);}' 

या और भी बेहतर इस तरह मार printf का उपयोग करने के लिए है डबल कोट्स के लिए कोड:

echo name,id,3 | awk '{print "\x22" $1 "\x22"}' 
"name,id,3"