แทนที่ลูกน้ำด้วยการขึ้นบรรทัดใหม่เป็น sed บน MacOS หรือไม่

ฉันมีไฟล์สตริงที่คั่นด้วยเครื่องหมายจุลภาค ฉันกำลังพยายามแทนที่ลูกน้ำด้วยบรรทัดใหม่ ฉันพยายามแล้ว:

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

แต่มันไม่ทำงาน ฉันพลาดอะไรไป?


person WildBill    schedule 25.05.2012    source แหล่งที่มา
comment
ลอง tr , '\n' ฉันเดาว่า sed ถือว่า \n เป็นข้อความธรรมดา   -  person Prince John Wesley    schedule 25.05.2012
comment
นั่นได้ผล! ไฟล์แมว | ตร , '\n'   -  person WildBill    schedule 25.05.2012
comment
tr , '\n' < file - ไม่มีไปป์   -  person Prince John Wesley    schedule 25.05.2012
comment
g ที่อยู่ท้ายสคริปต์มีไว้เพื่ออะไร ฉันได้รับพฤติกรรมแบบเดียวกันโดยไม่มีมัน   -  person HelloGoodbye    schedule 27.05.2015
comment
คุณใช้เชลล์อะไร? สิ่งนี้ใช้ได้กับฉันโดยใช้ bash shell   -  person HelloGoodbye    schedule 27.05.2015
comment
@HelloGoodbye g จะแทนที่อินสแตนซ์ทั้งหมดของอักขระ ในขณะที่การไม่มี g จะแทนที่เฉพาะอินสแตนซ์แรกของอักขระนั้นต่อบรรทัดเท่านั้น   -  person mchid    schedule 11.01.2018
comment
ขอโทษนะ @PrinceJohnWesley: มีข้อได้เปรียบอะไรบ้างที่ไม่มีการวางท่อ? อาจจะประมวลผลเร็วขึ้นหรือการจัดการ RAM ดีขึ้น?   -  person Sopalajo de Arrierez    schedule 25.01.2018
comment
ดูคำถามย้อนกลับ: unix stackexchange.com/questions/114943/   -  person ryenus    schedule 17.04.2019


คำตอบ (13)


ใช้ tr แทน:

tr , '\n' < file
person Prince John Wesley    schedule 25.05.2012
comment
มันไม่ได้เกิดขึ้นใน bash shell $ tr , '\n' aitr การใช้งาน: tr [-Ccsu] string1 string2 tr [-Ccu] -d string1 tr [-Ccu] -s string1 tr [-Ccu] -ds string1 string2 - person Learner; 20.01.2016
comment
การแทนที่เครื่องหมายจุลภาคด้วยอัฒภาคยังใช้งานได้: tr ',' ';' < input.csv > output.csv - person Wim Deblauwe; 24.02.2016

ใช้ สตริงเครื่องหมายคำพูด ANSI-C $'string'

คุณต้องขึ้นบรรทัดใหม่ตามตัวอักษรโดยใช้เครื่องหมายแบ็กสแลชเพื่อเข้าสู่ sed อย่างน้อยในการทุบตี $'' strings จะแทนที่ \n ด้วยการขึ้นบรรทัดใหม่จริง แต่คุณต้องเพิ่มแบ็กสแลชเป็นสองเท่าที่ sed จะเห็นเพื่อหลีกเลี่ยงการขึ้นบรรทัดใหม่ เช่น

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

หมายเหตุ สิ่งนี้จะไม่ ใช้งานได้กับเชลล์ทั้งหมด แต่จะทำงานกับเชลล์ทั่วไปที่สุด

person Walter Mundt    schedule 23.08.2013
comment
แปลก มันใช้งานได้กับแบ็กสแลชน้อยกว่าหนึ่งอันเช่น echo "a,b" | sed -e $'s/,/\\n/g - person Alexandre Holden Daly; 02.07.2014
comment
โหวตเห็นด้วย สำหรับข้อมูลเพิ่มเติม โปรดดูส่วน QUOTING ของ man bash - person tboyce12; 01.04.2015
comment
ใช้งานได้กับ OSX 10.11 : sed -E $'s/<\\/br>/\\\n/g' file ไม่จำเป็นต้องติดตั้ง gnu-sed - person Brice; 14.06.2016
comment
ตรวจสอบการทำงานบน OS X 10.7 ด้วยตัวอย่างที่ให้ไว้ ดูเหมือนว่าส่วน -e จะไม่จำเป็น - person Yongwei Wu; 22.07.2016
comment
OSX 10.10.5 ต้องใช้แบ็กสแลช 3 อัน: sed $'s/:/\\\n'/g <<<$PATH - person 7stud; 14.01.2017
comment
นี่มันเจ๋งมาก! การใช้สิ่งนี้กับ fzf เพื่อดีบั๊ก $PATH ของฉัน ในกรณีที่มีบางอย่างหายไป: echo $PATH | sed -e $'s/:/\\\n/g' | fzf ^.^ - person SidOfc; 31.08.2017
comment
@Brice ฉันคิดว่า gsed -e 's/,/\n/g' ทำงานบน gnu-sed เวอร์ชัน 4.4-1 - person mchid; 11.01.2018
comment
ดูเหมือนว่าฉันไม่ต้องการ '-e': echo foo,bar | sed $'s/,/\\n/g' อูบุนตู sed (GNU sed) 4.2.2 - person Hawkeye Parker; 09.07.2018
comment
ขอบคุณ มีเอกสารอ้างอิงเกี่ยวกับเรื่องนั้นไหม - person smarber; 17.08.2019
comment
@YongweiWu, -e นั้นโดยนัยหากคุณระบุเพียงคำสั่งเดียว หากต้องการมากกว่าหนึ่งคำสั่ง: sed -e 's/foo/bar' -e 's/boo/far' - person Daghall; 17.09.2020

sed 's/,/\
/g'

ทำงานบน Mac OS X

person Max Nanasy    schedule 07.09.2012
comment
ขอบคุณสำหรับสิ่งนี้ - สงสัยว่าเหตุใดเคล็ดลับ linux เก่าของฉันจึงไม่ทำงานใน OSX แต่นี่มัน! - person Wyatt Ward; 10.05.2014
comment
นี่เป็นทางออกเดียวที่ทำงานในสคริปต์ sed - person Firstrock; 12.05.2014
comment
โปรดทราบว่าแบ็กสแลช หลีก การขึ้นบรรทัดใหม่ตามตัวอักษร (เพื่อที่จะไม่ใช่ตัวยุติคำสั่ง): ไม่ใช่ อักขระต่อเนื่องของบรรทัด (เช่นใน bash เป็นต้น) หากต้องการดูความแตกต่าง ให้ลองเขียนคำสั่งด้านบนโดยไม่มีเครื่องหมายคำพูด: เชลล์จะตีความแบ็กสแลชแทนเป็นอักขระต่อเนื่องของบรรทัด จากนั้นเชลล์จะละทิ้งบรรทัดใหม่ ในทางกลับกัน ให้รวมเนื้อหาของนิพจน์ที่ยกมา (โดยไม่ต้องใส่เครื่องหมายคำพูด) ไว้ในไฟล์ comma-to-newline.sed แยกต่างหาก (ซึ่งกำจัดไวยากรณ์ของเชลล์) และใช้งานได้! - person Nils von Barth; 11.10.2014
comment
นี่เป็นสิ่งที่ดีเพราะสามารถแทนที่อะไรก็ได้ ไม่ใช่ตัวละคร tr ดูเหมือนว่าจะใช้ได้กับอักขระเท่านั้น หากคุณใส่สตริงเป็นพารามิเตอร์แรก มันจะแทนที่อักขระทั้งหมด ไม่ใช่สตริง - person Shawn; 09.03.2015
comment
ฉันอยู่บน Yosemite และฉันไม่สามารถใช้งานได้จนกว่าฉันจะเปลี่ยนการขึ้นบรรทัดใหม่ตามตัวอักษรที่เป็น Escape ด้วยแบ็กสแลช สอง ไม่ใช่หนึ่งอัน - person Droogans; 05.08.2015
comment
@Droogans คุณใช้ bash, sh หรือเชลล์อื่นหรือไม่? คุณแน่ใจหรือไม่ว่าคุณกำลังใช้เครื่องหมายคำพูดเดี่ยวแทนที่จะเป็นเครื่องหมายคำพูดคู่? - person Max Nanasy; 10.08.2015
comment
ฉันยืนยันได้ว่าใช้ไม่ได้กับ Yosemite ฉันใช้เครื่องหมายคำพูดเดี่ยว และมันใช้ไม่ได้กับฉันบน OSX 10.10.5 ไม่ว่าฉันจะใช้แบ็กสแลชกี่อัน ฉันก็ได้รับข้อผิดพลาด: รหัสคำสั่งไม่ถูกต้อง \ - person 7stud; 14.01.2017
comment
สิ่งนี้ทำให้ฉันมีเบาะแส ในที่สุดฉันก็ทำสิ่งนี้: sed $'s/,/\\\n/' เพื่อเก็บทุกอย่างไว้ในบรรทัดเดียว - person Wivlaro; 14.02.2017

หากการใช้งาน sed ของคุณมีแนวโน้มที่จะเป็นนิพจน์การทดแทนทั้งหมด (เช่นเดียวกับของฉัน) คุณสามารถใช้ perl -pe แทนได้

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

MacOS นั้นแตกต่างออกไป มีสองวิธีในการแก้ปัญหานี้ด้วย sed ใน mac

  • ก่อนอื่นให้ใช้ \'$'\n'' แทนที่ \n มันสามารถทำงานใน MacOS:

    sed 's/,/\'$'\n''/g' file
    
  • ประการที่สอง เพียงใช้บรรทัดว่าง:

    sed 's/,/\
    /g' file
    
  • ปล. ให้ความสนใจกับช่วงที่คั่นด้วย '

  • อย่างที่สาม ใช้ gnu-sed แทนที่ mac-sed

person Felix    schedule 13.03.2018

เห็นได้ชัดว่า \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
person Community    schedule 10.08.2013
comment
ฉันรู้ว่าคำถามบอกว่า OS X แต่สิ่งนี้ใช้ไม่ได้กับ GNU sed-4.2.2-6.fc20.x86_64 - person Cristian Ciupitu; 25.05.2014
comment
โปรดทราบว่า \r ไม่เหมือนกับ \n และอาจขัดขวางการจัดการและการใช้งานข้อมูลเพิ่มเติม - person Joel Purra; 11.10.2014
comment
ขออภัย สิ่งนี้ไม่ได้ผลสำหรับฉัน ฉันเพิ่งได้รับ 'r' โดยที่ควรจะขึ้นบรรทัดใหม่ - person Frank de Groot - Schouten; 31.05.2017
comment
คุณควรทำให้คำตอบชัดเจนยิ่งขึ้นว่าสิ่งนี้ให้ \r! - person pir; 28.08.2017
comment
มันได้ผลสำหรับฉัน แต่ฉันสงสัยว่าทำไม! \n เป็นมาตรฐานบน unix stackoverflow.com/questions/ 1761051/ความแตกต่างระหว่าง n-และ-r - person Alex; 15.01.2019
comment
สิ่งนี้ไม่ได้ผลสำหรับฉันเช่นกัน ฉันใช้ macos 10.13 โดยใช้ /usr/bin/sed - person Chris; 05.09.2019

ใช้งานได้กับ MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) และ RHE Linux (Red Hat Enterprise Linux Server รีลีส 5.3, Tikanga)...

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

... โดยที่ ^J ทำได้โดยการทำ ctrl+v+j อย่าลืม \ ก่อน ^J

ป.ล. ฉันรู้ว่า sed ใน RHEL คือ GNU, MacOS sed นั้นใช้ FreeBSD และแม้ว่าฉันจะไม่แน่ใจเกี่ยวกับ Solaris sed แต่ฉันเชื่อว่าสิ่งนี้จะใช้งานได้ค่อนข้างดีกับ sed ใด ๆ YMMV โธ่...

person Ramon Rey    schedule 13.01.2014

เพื่อให้เสร็จสมบูรณ์ สิ่งนี้ยังใช้งานได้:

echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
person ryenus    schedule 17.07.2013
comment
สิ่งนี้จะเหมาะสำหรับการประกวด Obfuscated C ยกเว้น Bash ;) - person Aaron R.; 18.03.2014
comment
@แอรอนอาร์. ฉันเห็นด้วย :-). แน่นอนว่าฉันชอบโซลูชัน tr ซึ่งเป็นคำตอบที่ยอมรับอยู่แล้ว - person ryenus; 24.03.2014
comment
สิ่งนี้ใช้ได้กับ OS X เหตุใดจึงเป็น \n\r แทนที่จะเป็น \r\n ฉันลอง \r\n ซึ่งเป็นลำดับที่จำเป็นบน Windows อย่างไรก็ตาม หลังจากที่ฉันทำเช่นนี้ มันจะทิ้งอักขระส่งคืน ^M จำนวนมากไว้ใน vim ดังนั้นฉันคิดว่ามันควรจะเป็นเพียง \n แต่ \n เพียงอย่างเดียวไม่ได้ผล - person NobleUplift; 24.03.2017

แม้ว่าฉันจะมาโพสต์นี้ช้า แต่เพียงอัปเดตสิ่งที่ฉันค้นพบ คำตอบนี้มีไว้สำหรับ Mac OS X เท่านั้น

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

ในคำสั่งข้างต้น ฉันลองใช้ Shift+Enter เพื่อเพิ่มบรรทัดใหม่ซึ่งใช้งานไม่ได้ คราวนี้ฉันลองใช้ "การหลบหนี" "การขึ้นบรรทัดใหม่ที่ไม่ได้ใช้ Escape" ตามที่บอกโดยข้อผิดพลาด

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

ได้ผล! (ใน Mac OS X 10.9.3)

person user2300875    schedule 17.06.2014
comment
นี่ไม่ต่างจากคำตอบของ Max Nanasy เมื่อสองปีก่อนคุณ - person miken32; 05.02.2016

$ echo $PATH | sed -e $'s/:/\\\n/g' 
/usr/local/sbin
/Library/Oracle/instantclient_11_2/sdk
/usr/local/bin

...

ใช้ได้กับฉันใน Mojave

person Paulo Henrique Lellis Gonalves    schedule 26.04.2019

เพียงเพื่อชี้แจง: man-page ของ sed บน OSX (10.8; Darwin Kernel เวอร์ชัน 12.4.0) พูดว่า:

[...]

นิพจน์ทั่วไปของ Sed

 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"

หมายเหตุ: คุณต้องพิมพ์ ‹ctrl>-v,‹return> เพื่อรับ '^M' ในตัวแก้ไข vi

person t3az0r    schedule 20.08.2013

sed บน macOS Mojave เปิดตัวในปี 2548 ดังนั้นวิธีแก้ปัญหาหนึ่งคือติดตั้ง 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

person DawnSong    schedule 24.05.2019

FWIW บรรทัดต่อไปนี้ใช้งานได้ใน windows และแทนที่อัฒภาคในตัวแปรพา ธ ของฉันด้วยการขึ้นบรรทัดใหม่ ฉันใช้เครื่องมือที่ติดตั้งไว้ภายใต้ไดเร็กทอรี git bin ของฉัน

echo %path% | sed -e $'s/;/\\n/g' | less
person Jeff LaFay    schedule 30.10.2014