Sed का उपयोग करते हुए दो दोहरे उद्धरण चिह्नों के बीच विकल्प मिलता है


14

मेरे पास एक फाइल है

xyz... rsync: "/home/path/to/file": Permission denied (13) rsync:
"/home/path/to/file1": Permission denied (13) rsync:
"/home/path/to/file2": Permission denied (13) rsync:
"/home/path/to/file3": Permission denied (13)

अब मैं केवल फ़ाइल पथ निकालना चाहता हूं और इसे किसी अन्य फ़ाइल में संग्रहीत करना चाहता हूं। आउटपुट फ़ाइल इस प्रकार है:

/home/path/to/file 
/home/path/to/file1 
/home/path/to/file2
/home/path/to/file3

Sed या awk का उपयोग करके मैं यह कैसे कर सकता हूं?

मैंने कोशिश की है, sed -n '/"/,/"/p' myfileलेकिन काम नहीं कर रहा है।


3
मतदान करने वालों के लिए - यह संभवतः ऑफ-टॉपिक कैसे हो सकता है? यह शेल प्रोग्रामिंग के बारे में है !! यह महत्वपूर्ण है जो ढेर अतिप्रवाह के लिए शीर्ष पर है!
जोनाथन लेफ्लर

2
ढेर अतिप्रवाह में आपका स्वागत है। जैसा कि आप देख सकते हैं, हमें कभी-कभी ऐसे लोगों से समस्या होती है जिनके पास खुजली वाली ट्रिगर उंगलियाँ होती हैं जो अच्छी तरह से अच्छे प्रश्नों को बंद कर देती हैं (जैसे कि यह एक) बंद होने के बुरे कारणों के साथ। यह सब कुछ अक्सर नहीं होता (या, मुझे समय पर समस्या को देखने को नहीं मिलता है), लेकिन ऐसा होता है। बहुत पहले पूछे जाने वाले प्रश्न पढ़ना न भूलें ।
जोनाथन लेफ्लर

जवाबों:


17

आप अपने rsync कमांड के स्टेकर को एक awk स्क्रिप्ट पर रख सकते हैं:

awk -F '"' '{print $2}' 

या इस तरह एक कट कमान करने के लिए:

cut -d'"' -f2

2
या, छोटा:cut -d\" -f2

@AndersJohansson: धन्यवाद मैंने आपके कट कमांड को भी उत्तर देने के लिए जोड़ा।
अनुभा 13

मुझे लगता है कि यह काम करने वाला नहीं है .. आप देख सकते हैं कि फ़ाइल पथ का फ़ील्ड नंबर $ 2 या f2 तय नहीं है .. धन्यवाद!

वास्तव में rsync हमेशा स्टेपर पर "और उसके बीच पहले फाइलपथ लिखेगा "
अनुभा

1
@ Jam88: वास्तव में, यह उस तरह से काम करेगा जिस तरह से शुभ ने इसे लिखा है। फ़ील्ड सीमांकक को दोहरे उद्धरण में सेट किया गया है। इसका मतलब है कि पहले दोहरे उद्धरण (संभवतः एक खाली स्ट्रिंग) तक सब कुछ है $1; पहले और दूसरे दोहरे उद्धरण के बीच सब कुछ है $2; और दूसरे दोहरे उद्धरण के बाद सब कुछ $3( $4, ...) में है। फ़ाइल का नाम (जाहिरा तौर पर) हमेशा पहले दो दोहरे उद्धरण चिह्नों के बीच होता है, इसलिए यह समाधान काम करना चाहिए (और जब मैंने इसका परीक्षण किया)।
जोनाथन लेफ़लर

6

का उपयोग कर sed:

sed 's/^[^"]*"\([^"]*\)".*/\1/'

इसके लिए लग रहा है: लाइन की शुरुआत, गैर-उद्धरणों की एक श्रृंखला, एक दोहरे उद्धरण, गैर-उद्धरणों की एक श्रृंखला पर कब्जा, एक डबल उद्धरण और रेखा पर कुछ और, और कैप्चर की गई सामग्री द्वारा प्रतिस्थापित करता है।

$ sed 's/^[^"]*"\([^"]*\)".*/\1/' <<'EOF'
> xyz... rsync: "/home/path/to/file": Permission denied (13) rsync:
> "/home/path/to/file1": Permission denied (13) rsync:
> "/home/path/to/file2": Permission denied (13) rsync:
> "/home/path/to/file3": Permission denied (13)
> EOF
/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3
$

जीएनयू के साथ आरएचईएल 5 लिनक्स पर टेस्ट करें sed, लेकिन केवल उन विशेषताओं का उपयोग करके जिन्होंने 7 वें संस्करण यूनिक्स ™ संस्करण में काम किया होगा sed

संयोग से, यह करने के लिए थोड़ा सरल तरीका दो स्थानापन्न आदेशों के साथ है; पहले डबल उद्धरण को खाली स्ट्रिंग सहित (जिसमें शून्य या अधिक गैर-उद्धरणों का अनुक्रम है और बाद में दोहरे उद्धरण सहित) सब कुछ बदल दें; अब कुछ भी नहीं करने के लिए पहली दोहरी बोली के बाद सब कुछ बदल:

sed 's/^[^"]*"//; s/".*//'

संयोग से, आपके द्वारा कमांड की गई (`sed -n '/" /, / "/ p') एक लाइन से प्रिंट होती है जिसमें एक डबल कोटे से अगली लाइन होती है जिसमें डबल कोट्स होते हैं, बिना लाइनों को एडिट किए। यही कारण है कि यह आपके लिए काम नहीं कर रहा था - यह वही किया जो आपने पूछा था, लेकिन आपने जो करने के लिए कहा था वह वह नहीं था जो आप इसे करने के लिए कहने का इरादा रखते थे।

दक्षता-वार, प्रदर्शन में एक औसत दर्जे का अंतर होने की संभावना नहीं है। रखरखाव में आसानी के संदर्भ में, मुझे संदेह है कि उत्तरार्द्ध मस्तिष्क की कोशिकाओं पर कम कर है।


1

यदि आपका संस्करण grepPerl-regexp का समर्थन करता है:

grep -oP '(?<=")/home/.*?(?=")' file >> anotherfile

परिणाम:

/home/path/to/file
/home/path/to/file1
/home/path/to/file2
/home/path/to/file3

यदि आप चाहें तो युगल के बीच कुछ भी मिलान करने के लिए आप इसे कम सख्त बना सकते हैं:

grep -oP '(?<=")[^"]*' file >> anotherfile

क्या आपको लाइन में बाद में एक अतिरिक्त दोहरे उद्धरण के मामले में .*गैर-लालची बनाने की आवश्यकता है .*?? या के [^"]*स्थान पर उपयोग करें .*?
जोनाथन लेफ्लर

-1

किसी फ़ाइल में किसी भी आउटपुट को बचाने के लिए >> ऑपरेटर का उपयोग करें।

पसंद

grep -r "pattern" * >> file.txt

तो बस अपने विशिष्ट परिदृश्य के लिए इसे बदलकर sed का उपयोग करके

>> filename

कमांड को


grep -r(तर्क में सूचीबद्ध किसी भी निर्देशिका के माध्यम से एक पुनरावर्ती खोज करता है *)। यह स्पष्ट नहीं है कि आपके दिमाग में क्या पैटर्न है, लेकिन grepपूरी लाइन को उठाएंगे। अभ्यास का उद्देश्य एक पंक्ति के भाग से जानकारी एकत्र करना है। यदि आप GNU का उपयोग कर रहे हैं grep, तो ऐसा करने के तरीके ( -o) हैं; ये गैर-मानक हैं (इस हद तक कि GNU एक वास्तविक मानक को परिभाषित करता है) को छोड़कर। इसी तरह पीसीआरई के नियमित अभिव्यक्तियों के उपयोग के साथ; वे एक और GNU एक्सटेंशन हैं। वे ठीक हैं यदि आपके पास जीएनयू है grepऔर उन प्लेटफार्मों पर काम करने की कोई योजना नहीं है जहां जीएनयू grepडिफ़ॉल्ट रूप से उपलब्ध नहीं है।
जोनाथन लेफ़लर

खेद है कि मैं चूक गया, मैंने सोचा कि वह सामान्य रूप से जानना चाहता था कि एक फाइल में आउटपुट डालने के लिए क्या करना है, और grep सिर्फ एक उदाहरण था।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.