Thay thế dấu phẩy bằng dòng mới trong sed trên MacOS?


286

Tôi có một tệp id được phân tách bằng dấu phẩy. Tôi đang cố gắng thay thế dấu phẩy bằng một dòng mới. Tôi đã thử:

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

nhưng nó không hoạt động. Tôi đang thiếu gì?


12
thử tr , '\n'. Tôi đoán, sed coi \nvăn bản đơn giản.
Hoàng tử John Wesley

1
Điều đó đã làm việc! tập tin mèo | tr, '\ n'
WildBill

7
tr , '\n' < file- không có đường ống.
Hoàng tử John Wesley

Phần gcuối của kịch bản là gì? Tôi nhận được hành vi tương tự mà không có nó.
HelloGoodbye

Bạn đang sử dụng vỏ gì? Điều này làm việc cho tôi, sử dụng bash shell.
HelloGoodbye

Câu trả lời:


361

Sử dụng trthay thế:

tr , '\n' < file

tôi đang tìm kiếm để thay thế '.' giai đoạn này, và đây là giải pháp tôi đang tìm kiếm :)
Jonah

1
Nó không phải là wokring trong bash shell $ tr, '\ n' aitr cách sử dụng: tr [-Ccsu] string1 string2 tr [-Ccu] -d string1 tr [-Ccu] -s string1 tr [-Ccu] -ds string1 string2
Học viên

5
Thay thế dấu phẩy bằng dấu chấm phẩy cũng có tác dụng:tr ',' ';' < input.csv > output.csv
Wim Deblauwe 24/2/2016

304

Sử dụng chuỗi trích dẫn ANSI-C $'string'

Bạn cần một dòng chữ mới thoát khỏi dấu gạch chéo ngược để có được sed. Trong bash ít nhất, các $''chuỗi sẽ thay thế \nbằng một dòng mới thực sự, nhưng sau đó bạn phải tăng gấp đôi dấu gạch chéo ngược mà sed sẽ thấy để thoát khỏi dòng mới, ví dụ:

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

Lưu ý điều này sẽ không hoạt động trên tất cả các shell , nhưng sẽ hoạt động trên những cái phổ biến nhất.


5
lạ, nó cũng hoạt động với một dấu gạch chéo ngược ít hơn echo "a,b" | sed -e $'s/,/\\n/g.
Alexandre Holden Daly

2
Nâng cao. Để biết thêm thông tin, xem phần "QUOTING" của man bash.
tboyce12

7
Nó đã hoạt động với OSX 10.11 : sed -E $'s/<\\/br>/\\\n/g' file, không cần cài đặt gnu-sed
Brice

2
Đã xác minh làm việc trên OS X 10.7 với ví dụ đã cho. Phần -ecó vẻ không cần thiết.
Yongwei Wu

1
ví dụ trong câu trả lời ngay lập tức hoạt động với tôi trong OSX 10.11.5
Jurriaan Roelofs

122
sed 's/,/\
/g'

hoạt động trên Mac OS X.


3
Cảm ơn vì điều này - Tự hỏi tại sao thủ thuật linux cũ của tôi không hoạt động trong OSX. Nhưng điều này không!
Wyatt8740

6
Đây là giải pháp duy nhất hoạt động trong một kịch bản sed.
Firstrock

6
Lưu ý rằng dấu gạch chéo ngược thoát khỏi dòng mới theo nghĩa đen (để nó không phải là dấu kết thúc lệnh): nó không phải là ký tự tiếp tục dòng (như trong bash, v.v.). Để thấy sự khác biệt, hãy thử viết lệnh trên mà không có dấu ngoặc kép: thay vào đó, dấu gạch chéo ngược sẽ được hiểu bởi shell là ký tự tiếp tục dòng và nó và dòng mới sẽ bị loại bỏ. Ngược lại, bao gồm các nội dung của biểu thức được trích dẫn (không có dấu ngoặc kép) trong một tệp dấu phẩy riêng biệt (loại bỏ cú pháp shell) và nó hoạt động!
Nils von Barth

1
Điều này là tốt vì nó có thể thay thế bất cứ điều gì, không phải là một nhân vật. Tr dường như chỉ làm việc với các nhân vật. nếu bạn đặt một chuỗi làm tham số đầu tiên, nó sẽ thay thế tất cả sự xuất hiện của các ký tự, không phải chuỗi.
Shawn

1
@Droogans Bạn đang sử dụng bash, sh hoặc shell khác? Bạn có chắc chắn đang sử dụng dấu ngoặc đơn thay vì dấu ngoặc kép?
Tối đa Nanasy

22

Nếu việc sử dụng sed của bạn có xu hướng hoàn toàn thay thế biểu thức (như của tôi có xu hướng), bạn cũng có thể sử dụng perl -pethay thế

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

15

Rõ ràng \rlà chìa khóa!

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

Chuyển đổi này:

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

Về điều này:

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

Tôi biết câu hỏi nói OS X, nhưng điều này không hoạt động với GNU sed-4.2.2-6.fc20.x86_64.
Cristian Ciupitu

10
Hãy nhớ rằng \rnó không giống như \n, và điều này có thể phá vỡ thao tác và sử dụng dữ liệu hơn nữa.
Joel Purra

3
Xin lỗi, điều này không làm việc cho tôi. Tôi vừa có một 'r' nơi cần có một dòng mới.
Frank de Groot - Schouten

Bạn nên làm rõ hơn trong câu trả lời mà điều này mang lại \r!
cướp biển

Nó làm việc cho tôi nhưng tôi tự hỏi tại sao! \ n là tiêu chuẩn trên unix stackoverflow.com/questions/1761051/difference-b between
Alex

15

Điều này hoạt động trên MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) và RHE Linux (Red Hat Enterprise Linux Server phát hành 5.3, Tikanga) ...

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

... trong đó việc ^Jđược thực hiện bằng cách thực hiện ctrl+ v+ j. Đừng bận tâm \trước ^J.

PS, tôi biết sed trong RHEL là GNU, MacOS sed dựa trên FreeBSD, và mặc dù tôi không chắc chắn về sed Solaris, tôi tin rằng nó sẽ hoạt động khá nhiều với bất kỳ sed nào. YMMV ...


12

MacOS thì khác, có hai cách để giải quyết vấn đề này với sed trong mac

  • Đầu tiên, sử dụng \'$'\n''thay thế \n, nó có thể hoạt động trong MacOS:

    sed 's/,/\'$'\n''/g' file
    
  • thứ hai, chỉ cần sử dụng một dòng trống:

    sed 's/,/\
    /g' file
    
  • Thi thiên Chú ý phạm vi cách nhau bởi '

  • thứ ba, sử dụng gnu-sed thay thế mac-sed


7

Để làm cho nó hoàn thành, điều này cũng hoạt động:

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

1
Điều này cũng phù hợp với cuộc thi Obfuscated C, ngoại trừ Bash;)
Aaron R.

@AaronR. Tôi đồng ý :-). Chắc chắn tôi thích trgiải pháp, đó đã là câu trả lời được chấp nhận.
ryenus

1
Điều này hoạt động trên OS X. Tại sao nó \n\rthay vì \r\n? Tôi đã thử \r\nđó là thứ tự cần thiết trên Windows. Tuy nhiên, sau khi tôi làm điều này, nó để lại rất nhiều ^Mnhân vật trở về trong xe ngựa vim, vì vậy tôi nghĩ rằng nó đáng lẽ chỉ có một mình \nnhưng \nkhông hoạt động.
NobleUplift

4

Mặc dù tôi đến trễ bài này, chỉ cập nhật những phát hiện của tôi. Câu trả lời này chỉ dành cho Mac OS X.

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

Trong lệnh trên, tôi đã thử với Shift + Enter để thêm dòng mới không hoạt động. Vì vậy, lần này tôi đã thử với "thoát" "dòng mới không thoát" như đã báo lỗi.

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

Đã làm việc! (trong Mac OS X 10.9.3)


Điều này không khác gì câu trả lời của Max Nanasy hai năm trước bạn.
miken32

2

Chỉ cần làm rõ: man-page của sed trên OSX (10.8; Darwin Kernel Phiên bản 12.4.0) nói:

[...]

Biểu hiện thường xuyên của 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.

[...]

vì vậy tôi đoán người ta phải sử dụng tr - như đã đề cập ở trên - hoặc tiện lợi

sed "s/,/^M
/g"

lưu ý: bạn phải nhập < ctrl> -v, < return> để nhận '^ M' trong trình chỉnh sửa vi



1

sedtrên macOS Mojave đã được phát hành vào năm 2005, vì vậy một giải pháp là cài đặt gnu-sed,

brew install gnu-sed

sau đó sử dụng gsedsẽ làm như bạn muốn,

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

Nếu bạn thích sed, chỉ sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew', được đề xuất bởi brew info gnu-sed. Khởi động lại thuật ngữ của bạn, sau đó seddòng lệnh của bạn là gsed.


0

FWIW, dòng sau hoạt động trong các cửa sổ và thay thế dấu chấm phẩy trong các biến đường dẫn của tôi bằng một dòng mới. Tôi đang sử dụng các công cụ được cài đặt trong thư mục git bin của tôi.

echo %path% | sed -e $'s/;/\\n/g' | less
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.