ฉันมีไฟล์สตริงที่คั่นด้วยเครื่องหมายจุลภาค ฉันกำลังพยายามแทนที่ลูกน้ำด้วยบรรทัดใหม่ ฉันพยายามแล้ว:
sed 's/,/\n/g' file
แต่มันไม่ทำงาน ฉันพลาดอะไรไป?
ฉันมีไฟล์สตริงที่คั่นด้วยเครื่องหมายจุลภาค ฉันกำลังพยายามแทนที่ลูกน้ำด้วยบรรทัดใหม่ ฉันพยายามแล้ว:
sed 's/,/\n/g' file
แต่มันไม่ทำงาน ฉันพลาดอะไรไป?
ใช้ tr
แทน:
tr , '\n' < file
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'
หมายเหตุ สิ่งนี้จะไม่ ใช้งานได้กับเชลล์ทั้งหมด แต่จะทำงานกับเชลล์ทั่วไปที่สุด
echo "a,b" | sed -e $'s/,/\\n/g
- person Alexandre Holden Daly; 02.07.2014
man bash
- person tboyce12; 01.04.2015
sed -E $'s/<\\/br>/\\\n/g' file
ไม่จำเป็นต้องติดตั้ง gnu-sed
- person Brice; 14.06.2016
-e
จะไม่จำเป็น
- person Yongwei Wu; 22.07.2016
sed $'s/:/\\\n'/g <<<$PATH
- person 7stud; 14.01.2017
fzf
เพื่อดีบั๊ก $PATH ของฉัน ในกรณีที่มีบางอย่างหายไป: echo $PATH | sed -e $'s/:/\\\n/g' | fzf
^.^
- person SidOfc; 31.08.2017
gsed -e 's/,/\n/g'
ทำงานบน gnu-sed เวอร์ชัน 4.4-1
- person mchid; 11.01.2018
echo foo,bar | sed $'s/,/\\n/g'
อูบุนตู sed (GNU sed) 4.2.2
- person Hawkeye Parker; 09.07.2018
-e
นั้นโดยนัยหากคุณระบุเพียงคำสั่งเดียว หากต้องการมากกว่าหนึ่งคำสั่ง: sed -e 's/foo/bar' -e 's/boo/far'
- person Daghall; 17.09.2020
sed 's/,/\
/g'
ทำงานบน Mac OS X
sed $'s/,/\\\n/'
เพื่อเก็บทุกอย่างไว้ในบรรทัดเดียว
- person Wivlaro; 14.02.2017
หากการใช้งาน sed ของคุณมีแนวโน้มที่จะเป็นนิพจน์การทดแทนทั้งหมด (เช่นเดียวกับของฉัน) คุณสามารถใช้ perl -pe
แทนได้
$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz
MacOS นั้นแตกต่างออกไป มีสองวิธีในการแก้ปัญหานี้ด้วย sed ใน mac
ก่อนอื่นให้ใช้ \'$'\n''
แทนที่ \n
มันสามารถทำงานใน MacOS:
sed 's/,/\'$'\n''/g' file
ประการที่สอง เพียงใช้บรรทัดว่าง:
sed 's/,/\
/g' file
ปล. ให้ความสนใจกับช่วงที่คั่นด้วย '
อย่างที่สาม ใช้ gnu-sed แทนที่ mac-sed
เห็นได้ชัดว่า \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
\r
ไม่เหมือนกับ \n
และอาจขัดขวางการจัดการและการใช้งานข้อมูลเพิ่มเติม
- person Joel Purra; 11.10.2014
\r
!
- person pir; 28.08.2017
ใช้งานได้กับ 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 โธ่...
เพื่อให้เสร็จสมบูรณ์ สิ่งนี้ยังใช้งานได้:
echo "a,b" | sed "s/,/\\$(echo -e '\n\r')/"
tr
ซึ่งเป็นคำตอบที่ยอมรับอยู่แล้ว
- person ryenus; 24.03.2014
\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)
$ echo $PATH | sed -e $'s/:/\\\n/g'
/usr/local/sbin
/Library/Oracle/instantclient_11_2/sdk
/usr/local/bin
...
ใช้ได้กับฉันใน Mojave
เพียงเพื่อชี้แจง: man-page ของ sed บน OSX (10.8; Darwin Kernel เวอร์ชัน 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"
หมายเหตุ: คุณต้องพิมพ์ ‹ctrl>-v,‹return> เพื่อรับ '^M' ในตัวแก้ไข vi
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
FWIW บรรทัดต่อไปนี้ใช้งานได้ใน windows และแทนที่อัฒภาคในตัวแปรพา ธ ของฉันด้วยการขึ้นบรรทัดใหม่ ฉันใช้เครื่องมือที่ติดตั้งไว้ภายใต้ไดเร็กทอรี git bin ของฉัน
echo %path% | sed -e $'s/;/\\n/g' | less
tr , '\n'
ฉันเดาว่า sed ถือว่า\n
เป็นข้อความธรรมดา - person Prince John Wesley   schedule 25.05.2012tr , '\n' < file
- ไม่มีไปป์ - person Prince John Wesley   schedule 25.05.2012g
ที่อยู่ท้ายสคริปต์มีไว้เพื่ออะไร ฉันได้รับพฤติกรรมแบบเดียวกันโดยไม่มีมัน - person HelloGoodbye   schedule 27.05.2015g
จะแทนที่อินสแตนซ์ทั้งหมดของอักขระ ในขณะที่การไม่มีg
จะแทนที่เฉพาะอินสแตนซ์แรกของอักขระนั้นต่อบรรทัดเท่านั้น - person mchid   schedule 11.01.2018