MacOS पर sed में नईलाइन के साथ अल्पविराम बदलें?


287

मेरे पास आईडी की एक फाइल है जो अल्पविराम से अलग है। मैं अल्पविराम को एक नई पंक्ति के साथ बदलने का प्रयास कर रहा हूं। मैंने कोशिश की:

sed 's/,/\n/g' file

लेकिन यह काम नहीं कर रहा है। मैं क्या खो रहा हूँ?


12
कोशिश करो tr , '\n'। मुझे लगता है, sed \nसादे पाठ के रूप में व्यवहार करता है ।
प्रिंस जॉन वेस्ले

1
वह काम किया! बिल्ली फ़ाइल | tr, '\ n'
WildBill

7
tr , '\n' < file- कोई पाइप नहीं।
प्रिंस जॉन वेस्ले

gस्क्रिप्ट के अंत में क्या है ? मुझे इसके बिना भी वैसा ही व्यवहार मिलता है।
HelloGoodbye

आप किस खोल का उपयोग कर रहे हैं? यह मेरे लिए काम करता है, बैश शेल का उपयोग करके।
HelloGoodbye

जवाबों:


362

trइसके बजाय उपयोग करें :

tr , '\n' < file

मैं 'की जगह ले रहा था।' अवधि, और यह हल था मैं देख रहा हूँ :)
योना

1
यह बाश शेल $ tr, '\ n' एटर के उपयोग में नहीं है: tr [-Ccsu] string1 string2 tr [-Ccu] -d string1 tr [-ccu] -s string1 tr [-ccu] -ds string1 string2
शिक्षार्थी

5
अर्धविराम के साथ अल्पविराम को बदलना भी काम करता है:tr ',' ';' < input.csv > output.csv
Wim Deblauwe

304

ANSI-C उद्धृत स्ट्रिंग का उपयोग करें $'string'

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

echo "a,b" | sed -e $'s/,/\\\n/g'

ध्यान दें कि यह सभी गोले पर काम नहीं करेगा , लेकिन सबसे आम लोगों पर काम करेगा।


5
अजीब बात है, यह एक बैकस्लैश के साथ भी कम काम करता है echo "a,b" | sed -e $'s/,/\\n/g
अलेक्जेंड्रे होल्डन डैली

2
Upvoted। अधिक जानकारी के लिए "QUOTING" अनुभाग देखें man bash
tboyce12

7
समझे कि यह OSX 10.11 के साथ काम कर रहा है: sed -E $'s/<\\/br>/\\\n/g' fileकोई भी ग्नू सेड को स्थापित करने की आवश्यकता नहीं है
Brice

2
दिए गए उदाहरण के साथ ओएस एक्स 10.7 पर काम कर रहे सत्यापित। -eभाग आवश्यक नहीं लगता है।
योंगवेई वू

1
उदाहरण में जवाब तुरंत OSX
10.11.5

122
sed 's/,/\
/g'

मैक ओएस एक्स पर काम करता है।


3
इसके लिए धन्यवाद - सोच रहा था कि OSX में मेरी पुरानी लिनक्स चाल क्यों नहीं चली। लेकिन यह करता है!
व्याट8740

6
यह एकमात्र समाधान है जो एक sed स्क्रिप्ट में काम करता है।
फर्स्टॉक

6
ध्यान दें कि बैकस्लैश निकल जाता शाब्दिक न्यू लाइन (इतना है कि यह एक कमांड टर्मिनेटर नहीं है): यह है नहीं (बैश में के रूप में, आदि) के लिए एक लाइन निरंतरता चरित्र। अंतर देखने के लिए, उद्धरण के बिना उपरोक्त कमांड लिखने का प्रयास करें: बैकस्लैश को शेल द्वारा एक लाइन निरंतरता चरित्र के रूप में व्याख्या किया जाएगा और इसे और नई लाइन को छोड़ दिया जाएगा। इसके विपरीत, एक अलग अल्पविराम-से-newline.sed फ़ाइल (जो शेल सिंटैक्स को समाप्त करता है) में उद्धृत अभिव्यक्ति (बिना उद्धरण के) की सामग्री शामिल करें, और यह काम करता है!
निल्स वॉन बर्थ

1
यह अच्छा है क्योंकि यह कुछ भी बदल सकता है, चरित्र नहीं। tr केवल पात्रों के साथ काम करता है। यदि आप पहले पैरामीटर के रूप में एक स्ट्रिंग डालते हैं, तो यह स्ट्रिंग की नहीं बल्कि पात्रों की सभी घटना को प्रतिस्थापित करेगा।
शॉन

1
@ ड्रोगन्स क्या आप बैश, श या एक अलग शेल का उपयोग कर रहे हैं? क्या आप सुनिश्चित हैं कि आप दोहरे उद्धरण चिह्नों के बजाय एकल उद्धरणों का उपयोग कर रहे हैं?
मैक्स नानसी

22

यदि आपका sed उपयोग पूरी तरह से प्रतिस्थापन अभिव्यक्ति के रूप में होता है (जैसा कि मेरा होता है), आप perl -peइसके बजाय भी उपयोग कर सकते हैं

$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz

15

जाहिर \rहै कुंजी है!

$ sed 's/, /\r/g' file3.txt > file4.txt

इसे ट्रांसफ़ॉर्म किया गया:

ABFS, AIRM, AMED, BOSC, CALI, ECPG, FRGI, GERN, GTIV, HSON, IQNT, JRCC, LTRE,
MACK, MIDD, NKTR, NPSP, PME, PTIX, REFR, RSOL, UBNT, UPI, YONG, ZEUS

इसके लिए:

ABFS
AIRM
AMED
BOSC
CALI
ECPG
FRGI
GERN
GTIV
HSON
IQNT
JRCC
LTRE
MACK
MIDD
NKTR
NPSP
PME
PTIX
REFR
RSOL
UBNT
UPI
YONG
ZEUS

मुझे पता है कि सवाल ओएस एक्स कहता है, लेकिन यह GNU sed-4.2.2-6.fc20.x86_64 के साथ काम नहीं करता है।
क्रिस्टियन सियुपिटु

10
ध्यान रखें कि \rजैसा है वैसा नहीं है \n, और इससे डेटा हेरफेर और उपयोग टूट सकता है।
जोएल पूर्वा

3
क्षमा करें, यह मेरे लिए काम नहीं किया। मुझे सिर्फ एक 'आर' मिला जहां एक नई रूपरेखा होनी चाहिए।
फ्रैंक डी ग्रोट - स्काउटन

आपको यह उत्तर देने में अधिक स्पष्ट करना चाहिए कि यह क्या देता है \r!
पीर

इसने मेरे लिए काम किया लेकिन मुझे आश्चर्य है कि क्यों! \ N यूनिक्स पर मानक है stackoverflow.com/questions/1761051/difference-between-n-and-r
एलेक्स

15

यह MacOS माउंटेन लायन (10.8), सोलारिस 10 (SunOS 5.10) और RHE लिनक्स (Red Hat Enterprise Linux सर्वर रिलीज़ 5.3, टिकंगा) पर काम करता है ...

$ sed 's/{pattern}/\^J/g' foo.txt > foo2.txt

... जहाँ + ^Jकरने से काम + होता है । मन से पहले करो ।ctrlvj\^J

पुनश्च, मुझे पता है कि आरएचईएल में सीएनडी जीएनयू है, मैकओएस सिड फ्रीबीएसडी आधारित है, और हालांकि मैं सोलारिस सेड के बारे में निश्चित नहीं हूं, मेरा मानना ​​है कि यह किसी भी सेड के साथ बहुत काम करेगा। YMMV थियो '...


12

मैकओएस अलग है, मैक में सीड के साथ इस समस्या को हल करने का दो तरीका है

  • पहले, \'$'\n''प्रतिस्थापन का उपयोग करें \n, यह MacOS में काम कर सकता है:

    sed 's/,/\'$'\n''/g' file
    
  • दूसरा, बस एक खाली लाइन का उपयोग करें:

    sed 's/,/\
    /g' file
    
  • Ps। द्वारा विभाजित सीमा पर ध्यान दें '

  • तीसरा, मैक-सेड की जगह ग्नू-सेड का उपयोग करें


7

इसे पूरा करने के लिए, यह भी काम करता है:

echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"

1
यह भी ओछे सी प्रतियोगिता के लिए उपयुक्त होगा, सिवाय इसके बैश;)
एरोन आर।

@AaronR। मैं सहमत हूँ :-)। निश्चित रूप से मैं trसमाधान पसंद करता हूं , जो पहले से ही स्वीकृत उत्तर है।
रेनस

1
इसने OS X पर काम किया। इसके \n\rबजाय यह क्यों है \r\n? मैंने कोशिश की \r\nजो विंडोज पर आवश्यक आदेश है। हालाँकि, ऐसा करने के बाद मैं बहुत सारे ^Mगाड़ी वापसी पात्रों को छोड़ vimरहा हूँ, इसलिए मुझे लगता है कि यह केवल होना चाहिए, \nलेकिन \nअकेले काम नहीं करता है।
नोबल उत्थान

4

हालांकि मुझे इस पद के लिए देर हो रही है, बस अपने निष्कर्षों को अपडेट कर रहा हूं। यह उत्तर केवल मैक ओएस एक्स के लिए है।

$ sed 's/new/
> /g' m1.json > m2.json
sed: 1: "s/new/
/g": unescaped newline inside substitute pattern

उपरोक्त कमांड में मैंने नई लाइन जोड़ने के लिए Shift + Enter के साथ प्रयास किया जो काम नहीं किया। इसलिए इस बार मैंने त्रुटि के द्वारा "बची हुई नई लाइन" से बचने की कोशिश की।

$ sed 's/new/\
> /g' m1.json > m2.json 

काम किया! (मैक ओएस एक्स 10.9.3 में)


यह आपके दो साल पहले के मैक्स नानसी के जवाब से अलग नहीं है।
miken32

2

बस स्पष्ट करने के लिए: ओएसएक्स पर मानव-पृष्ठ (10.8; डार्विन कर्नेल संस्करण 12.4.0) कहते हैं:

[...]

सेड रेगुलर एक्सप्रेशन

 The regular expressions used in sed, by default, are basic regular expressions (BREs, see re_format(7) for more information), but extended
 (modern) regular expressions can be used instead if the -E flag is given.  In addition, sed has the following two additions to regular
 expressions:

 1.   In a context address, any character other than a backslash (``\'') or newline character may be used to delimit the regular expression.
      Also, putting a backslash character before the delimiting character causes the character to be treated literally.  For example, in the
      context address \xabc\xdefx, the RE delimiter is an ``x'' and the second ``x'' stands for itself, so that the regular expression is
      ``abcxdef''.

 2.   The escape sequence \n matches a newline character embedded in the pattern space.  You cannot, however, use a literal newline charac-
      ter in an address or in the substitute command.

[...]

इसलिए मुझे लगता है कि किसी को tr का उपयोग करना होगा - जैसा कि ऊपर बताया गया है - या निफ्टी

sed "s/,/^M
/g"

नोट: आपको vi संपादक में '^ M' प्राप्त करने के लिए < ctrl> -v, < वापसी> टाइप करना होगा



1

sedMacOS पर Mojave को 2005 में जारी किया गया था, इसलिए इसका एक समाधान स्थापित करना है gnu-sed,

brew install gnu-sed

फिर gsedजैसा चाहोगे वैसा उपयोग करोगे,

gsed 's/,/\n/g' file

यदि आप पसंद करते हैं sed, तो बस sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew', जिसका सुझाव दिया गया है brew info gnu-sed। अपने पद को पुनः आरंभ करें, फिर आपकी sedकमांड लाइन में है gsed


0

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

echo %path% | sed -e $'s/;/\\n/g' | less
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.