मैक ओएस एक्स पर सेड में नयापन


40

मुझे लगता है कि \nमैक ओएस एक्स के तहत sed में काम नहीं करता है। विशेष रूप से, कहो कि मैं एक ही स्थान द्वारा अलग किए गए शब्दों को लाइनों में तोड़ना चाहता हूं:

# input
foo bar

मैं उपयोग करता हूं,

echo "foo bar" | sed 's/ /\n/'

लेकिन नतीजा बेवकूफ़ है, \nबच नहीं रहा है!

foonbar

Google से परामर्श करने के बाद, मुझे एक वर्क अराउंड मिला :

echo 'foo bar' | sed -e 's/ /\'$'\n/g'

लेख पढ़ने के बाद, मैं अभी भी समझ नहीं पा रहा हूं कि \'$'\n/g'इसका क्या मतलब है। क्या कोई इसे मुझे समझा सकता है, या यदि कोई अन्य तरीका है? धन्यवाद!


यह भी शायद काम करेगा:echo "foo bar" | tr ' ' '\n'
ग्लेन जैकमैन

3
सलाह के लिए धन्यवाद। लेकिन वर्तमान में मैं उदाहरण के रूप में उपरोक्त मामले का उपयोग करता हूं, मुझे यह जानने की जरूरत है कि कैसे बच सकते हैं \n
इवान जेडजी जिओ

संभावित डुप्लिकेट: stackoverflow.com/questions/21621722/…
7

जवाबों:


26

आप कर सकते हैं brew install gnu-sedऔर करने के लिए कॉल की जगह sedके साथ gsed

यदि आप "जी" को पूर्व निर्धारित नहीं करना चाहते हैं sed, तो आप brew install gnu-sed --with-default-namesकॉल कर सकते हैं sed

(संपादित करें: अद्यतित काढ़ा ध्वज, टोपी से लेकर क्लेमेंट तक।)


मैक प्लेटफ़ॉर्म की हर विशिष्टताओं से निपटने की तुलना में सभी प्लेटफ़ॉर्म पर एक ही सॉफ़्टवेयर का उपयोग करना आसान है। खबरदार, विकल्प अब --with-default-namesऔर नहीं है --default-names । हालांकि, इस विकल्प ने मेरी स्थापना पर काम नहीं किया, इसलिए मुझे इसे काम करने के लिए alias gsed=sedअपने में डालना पड़ा ~/.profile
क्लेमेंट

4
यह एक बदसूरत वर्कअराउंड है। यह नहीं समझाता है कि sedओएस एक्स क्यों करता है जिस तरह से व्यवहार करता है और गलत धारणा बनाता है जो gnu-sedअधिक सही है। एक GNU-addict मत बनो और लंबे समय में समस्याओं से बचने के लिए POSIX मानकों से चिपके रहो।
ऑक्टोस्क्विडोपस

यह है कि Apple को अपने ओएस को डिफ़ॉल्ट रूप से कैसे काम करना चाहिए। एक कार्यक्रम के नाम का उपयोग क्यों करें और फिर इसे अलग तरीके से काम करें? मैं इस वजह से एक घंटा बर्बाद करता हूं ...
rascio

@rascio - क्योंकि ओएस एक्स बीएसडी-जैसा है और लिनक्स लिनक्स जैसा है।
१18 ’

@rascio मुझे लगता है कि आपको पता चलेगा कि GNU सेड न्यूकमर है; BSD sed सन 1979 से पहले ( en.wikipedia.org/wiki/Version_7_Unix देखें )।
डंकन बेने

20

ये भी काम करेंगे:

echo 'foo bar' | sed 's/ /\
/g'

echo 'foo bar' | sed $'s/ /\\\n/g'

lf=$'\n'; echo 'foo bar' | sed "s/ /\\$lf/g"

OS X की सेड, बदले हुए \nपैटर्न में व्याख्या नहीं करती है, लेकिन आप एक लाइन निरंतरता चरित्र द्वारा पूर्ववर्ती शाब्दिक लाइनफीड का उपयोग कर सकते हैं। शेल $'\n'कमांड कमांड चलने से पहले शाब्दिक लाइनफीड के साथ बदल देता है।


4
क्यों sed $'s/ /\\\n/g'काम करता है , लेकिन नहीं sed $'s/\\\n/ /g'?
एलेक जैकबसन 23

1
@alec आप sednewlines निकालने के लिए linux / unix में भी उपयोग नहीं कर सकते हैं क्योंकि प्रत्येक newline पर इसका पार्स / स्प्लिट है। यदि आप इसे linux / unix में चलाते हैं, तो यह कुछ भी नहीं करेगा:echo -e 'foo\nbar' | sed 's/\n//'
wisbucky

10

आपके द्वारा पाया गया वर्कअराउंड एक एकल तर्क स्ट्रिंग पास करता है sed -e

वह तर्क समाप्त होता है जो परिचित सीड s/ / /gप्रारूप में एक स्ट्रिंग है ।

उस तार को दो भागों में बनाया जाता है, एक के बाद एक।

पहले भाग को रूप में उद्धृत किया गया '...'है।

दूसरे भाग को रूप में उद्धृत किया गया $'...'है।

इस 's/ /\'हिस्से को सिंगल-कोट्स से अलग कर दिया जाता है, लेकिन अन्यथा कमांड-लाइन पर दिखने के साथ ही सेड से गुजरता है। यही है, बैकस्लैश बैश द्वारा नहीं खाया जाता है, इसे सेड के पास भेजा जाता है।

$'\n/g'भाग डॉलर चिह्न और एकल उद्धरण बंद छीन हो जाता है, और \nएक नई पंक्ति चरित्र में परिवर्तित हो जाता।

सब मिलकर तर्क बन जाते हैं

एस / / \ newline/ जी

[वह मजेदार था। कुछ ही देर में उसे खोल दिया। एक दिलचस्प सवाल के लिए +1]


7

एक्सप्रेशन $'...'एक bashएज़्म है जो ...मानक एस्केप सीक्वेंस के साथ विस्तारित होता है। गु \'से पहले इसका अर्थ है कि उद्धृत खंड के अंत के बाद एक बैकस्लैश, जिसके परिणामस्वरूप स्ट्रिंग है s/ /\। (हां, आप स्ट्रिंग के बीच में उद्धृत कर सकते हैं; यह स्ट्रिंग को समाप्त नहीं करता है।)

POSIX मानक sedकेवल \nएक खोज पैटर्न के भाग के रूप में स्वीकार करता है । OS X FreeBSD का उपयोग करता है sed, जो कड़ाई से POSIX का अनुपालन करता है; जीएनयू, हमेशा की तरह, अतिरिक्त सामान जोड़ता है और फिर लिनक्स उपयोगकर्ता सभी सोचते हैं कि यह किसी प्रकार का "मानक" है (शायद मैं अधिक प्रभावित हो सकता हूं अगर उनमें से कोई एक मानक प्रक्रिया थी)।


अब मैं $'...'हिस्सा समझ गया हूं । लेकिन ... क्या है s/ /\ ? आपका क्या मतलब है switch quoting?
इवान जेडजी जिओ

2
'...'एक प्रकार का खोल है; $'...'दूसरा है। वहाँ भी है "..."और \xएक ही चरित्र उद्धृत करने के लिए। आप उन्हें एक शब्द में जोड़ सकते हैं, जो कि वहां किया जा रहा था, अनुवाद करने के ''लिए सामान्य स्ट्रिंग से स्ट्रिंग में स्विच $''करना \n। बाकी के लिए, यह एक sedकमांड ( s/text/replacement/flags) बना रहा है। इस मामले में कमांड शुरू किया जाता है, जिसमें एपल के शाब्दिक न्यूलाइन की रक्षा के लिए एक बैकस्लैश भी शामिल है $'\n/g'। परिणाम सभी ( /gध्वज) रिक्त स्थान को नई सुर्खियों के साथ बदलना है।
गीकॉर्पोस

1

नेत्रहीन देखने के लिए बहुत आसान है कि क्या हो रहा है। बस स्ट्रिंग गूंज!

echo 's/$/\'$'\n/g'

का परिणाम

s/$/\
/g

के बराबर है s/$/\newline/g

आप अतिरिक्त आपके पास नहीं था \इससे पहले newline, खोल व्याख्या newlineआदेश को समय से पहले के अंत के रूप में।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.