แทนที่เครื่องหมายจุลภาคด้วยบรรทัดใหม่ใน sed บน MacOS หรือไม่


287

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

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

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


12
tr , '\n'ความพยายาม ฉันเดาว่า sed ถือว่า\nเป็นข้อความธรรมดา
เจ้าชายจอห์นเวสลีย์

1
นั่นได้ผล! ไฟล์ cat tr, '\ n'
WildBill

7
tr , '\n' < file- ไม่มีท่อ
เจ้าชายจอห์นเวสลีย์

อะไรคือสิ่งที่gในตอนท้ายของสคริปต์สำหรับ? ฉันได้รับพฤติกรรมเดียวกันโดยปราศจากมัน
HelloGoodbye

คุณใช้เปลือกอะไร สิ่งนี้ใช้ได้กับฉันโดยใช้เปลือก bash
HelloGoodbye

คำตอบ:


362

ใช้trแทน:

tr , '\n' < file

ฉันกำลังมองหาการแทนที่ '.' ช่วงเวลาและนี่คือคำตอบที่ฉันกำลังมองหา :)
Jonah

1
มันไม่ได้ทำงานในเปลือก bash $ tr, การใช้งาน '\ n' aitr: 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'

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

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

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


5
echo "a,b" | sed -e $'s/,/\\n/gที่แปลกก็ยังทำงานร่วมกับหนึ่งทับขวาน้อยคือ
Alexandre Holden Daly

2
upvoted สำหรับข้อมูลเพิ่มเติมโปรดดูที่ "อ้าง" man bashส่วนของ
tboyce12

7
ทำให้มันทำงานกับ OSX 10.11: sed -E $'s/<\\/br>/\\\n/g' fileไม่จำเป็นต้องติดตั้ง gnu-sed
Brice

2
ตรวจสอบแล้วทำงานบน OS X 10.7 พร้อมตัวอย่างที่ระบุ -eส่วนหนึ่งดูเหมือนว่าไม่จำเป็น
Yongwei Wu

1
ตัวอย่างในคำตอบใช้งานได้กับฉันใน OSX 10.11.5 ทันที
Jurriaan Roelofs

122
sed 's/,/\
/g'

ทำงานบน Mac OS X


3
ขอบคุณสำหรับสิ่งนี้ - สงสัยว่าเพราะเหตุใดเคล็ดลับ linux เก่าของฉันจึงไม่ทำงานใน OSX แต่นี่มัน!
Wyatt8740

6
นี่เป็นทางออกเดียวที่ทำงานในสคริปต์ sed
Firstrock

6
โปรดทราบว่าแบ็กสแลชจะหนีขึ้นบรรทัดใหม่ตามตัวอักษร (เพื่อที่จะไม่ใช่ตัวคั่นคำสั่ง): มันไม่ได้เป็นตัวอักษรต่อเนื่องของบรรทัด (เช่นในทุบตี ฯลฯ ) หากต้องการดูความแตกต่างให้ลองเขียนคำสั่งด้านบนโดยไม่ใส่เครื่องหมายอัญประกาศ: เครื่องหมายแบ็กสแลชจะถูกตีความโดยเชลล์แทนอักขระที่มีความต่อเนื่องของบรรทัดและคำสั่งนั้นจะขึ้นบรรทัดใหม่ ในทางกลับกันให้รวมเนื้อหาของนิพจน์ที่ยกมา (โดยไม่ใส่เครื่องหมายอัญประกาศ) ในไฟล์ comma-to-newline.sed ที่แยกต่างหาก (ซึ่งกำจัดไวยากรณ์ของเชลล์) และทำงานได้!
Nils von Barth

1
มันดีเพราะมันสามารถแทนที่อะไรก็ได้ไม่ใช่ตัวละคร ดูเหมือนว่า tr ทำงานได้กับตัวละครเท่านั้น ถ้าคุณใส่สตริงเป็นพารามิเตอร์แรกมันจะแทนที่อักขระทั้งหมดที่เกิดขึ้นไม่ใช่สตริง
Shawn

1
@Droogans คุณใช้ bash, sh, หรือ shell อื่นหรือไม่? คุณแน่ใจหรือว่าคุณกำลังใช้เครื่องหมายคำพูดเดี่ยวแทนที่จะเป็นเครื่องหมายคำพูดคู่
Max Nanasy

22

หากการใช้งานที่ไม่ดีของคุณมีแนวโน้มที่จะเป็นนิพจน์ทดแทนทั้งหมด (ตามที่มีแนวโน้มว่าจะเป็นของคุณ) คุณสามารถใช้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

ฉันรู้คำถามว่า OS X แต่มันใช้ไม่ได้กับ GNU sed-4.2.2-6.fc20.x86_64
Cristian Ciupitu

10
โปรดจำไว้ว่า\rไม่เหมือนกัน\nและอาจทำให้การจัดการและการใช้ข้อมูลเพิ่มเติมขัดข้อง
Joel Purra

3
ขออภัยนี่ไม่ได้ผลสำหรับฉัน ฉันเพิ่งได้ 'r' ที่ควรมีการขึ้นบรรทัดใหม่
Frank de Groot - Schouten

คุณควรทำให้ชัดเจนยิ่งขึ้นในคำตอบที่ให้\r!
pir

มันใช้งานได้สำหรับฉัน แต่ฉันสงสัยว่าทำไม! \ n เป็นมาตรฐานสำหรับ unix stackoverflow.com/questions/1761051/difference-between-n-and-r
Alex

15

ใช้งานได้กับ 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ก่อน

PS, ฉันรู้ว่า sed ใน RHEL คือ GNU, sed MacOS เป็น FreeBSD และถึงแม้ว่าฉันไม่แน่ใจเกี่ยวกับ Solaris sed แต่ฉันเชื่อว่านี่จะทำงานได้ดีกับ sed ใด ๆ YMMV ถ้ ...


12

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

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

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

    sed 's/,/\
    /g' file
    
  • ps ให้ระวังช่วงที่คั่นด้วย '

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


7

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

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

1
สิ่งนี้จะเหมาะสมสำหรับการประกวด C ที่น่าอับอายยกเว้น Bash;)
Aaron R.

@AaronR ฉันเห็นด้วย :-). แน่นอนฉันชอบtrวิธีแก้ปัญหาซึ่งเป็นคำตอบที่ยอมรับแล้ว
ryenus

1
นี้ทำงานบน OS X ได้ทำไมมันจึงเป็น\n\rแทน\r\n? ฉันพยายาม\r\nซึ่งเป็นคำสั่งที่จำเป็นใน Windows อย่างไรก็ตามหลังจากที่ฉันทำสิ่งนี้แล้วมันก็ทำให้^Mตัวละครคืนรถvimมากมายดังนั้นฉันคิดว่ามันควรจะมี\nแต่ตัว\nเดียวเท่านั้นที่ใช้งานไม่ได้
NobleUplift

4

แม้ว่าฉันจะมาถึงตอนนี้โพสต์เพียงแค่ปรับปรุงการค้นพบของฉัน คำตอบนี้สำหรับ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)


นี่ไม่ต่างจากคำตอบของ Max Nanasy เมื่อสองปีก่อน
miken32

2

เพียงเพื่อชี้แจง: man-page ของ sed บน OSX (10.8; เคอร์เนลดาร์วินเวอร์ชัน 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



1

sedบน MacOS ซ้อมได้รับการปล่อยตัวในปี 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รีสตาร์ทระยะของคุณแล้วคุณบรรทัดคำสั่งคือsedgsed


0

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

echo %path% | sed -e $'s/;/\\n/g' | less
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.