2012-02-27 58 views

Trả lời

3

Bạn chỉ phải trốn thoát với một nhân vật dấu chéo ngược và nhấn vào phím khi gõ:

$ sed 's/),(/),\ 
(/g' temp.txt 
(foo), 
(bar) 
(foobar), 
(foofoobar) 
+0

Điều này không có tác dụng nếu bạn đặt lệnh sed trong một tệp bash. Chỉ khi bạn đặt '\\' trước ký tự dòng mới, nó bắt đầu hoạt động. Nhưng tôi tự hỏi tại sao? – qazwsx

+0

@ user001 Đối với những gì có giá trị, chính xác cùng một lệnh làm việc cho tôi trong bash 4.2.10 trong Ubuntu 11.10. – jcollado

6

sed không hỗ trợ các chuỗi \n thoát trong substitu của nó lệnh tion, tuy nhiên, nó không hỗ trợ một ký tự xuống dòng thực nếu bạn thoát khỏi nó (vì sed lệnh chỉ nên sử dụng một dòng duy nhất, và thoát là ở đây để nói với sed mà bạn thực sự muốn có một ký tự xuống dòng):

$ sed 's/),(/),\\ 
(/g' temp.txt 
(foo), 
(bar) 
(foobar), 
(foofoobar) 

Bạn cũng có thể sử dụng biến trình bao để lưu trữ ký tự dòng mới.

$ NL=' 
' 
$ sed "s/),(/,\\$NL(/g" temp.txt 
(foo), 
(bar) 
(foobar), 
(foofoobar) 

Được thử nghiệm trên Mac OS X Lion, sử dụng bash làm vỏ.

+0

Trong phương pháp đầu tiên, tại sao nó cần phải là '\\' nhưng không phải là '\'? – qazwsx

+0

Lệnh bạn chuyển đến 'sed' không được phép chứa dòng mới. Vì vậy, nếu bạn muốn vượt qua một dòng mới, bạn cần phải thoát khỏi nó với một dấu gạch chéo ngược để 'sed' biết bạn đã làm trên mục đích. Và bạn cần một dấu gạch chéo ngược thứ hai để bảo vệ đầu tiên không được diễn giải bởi shell (sử dụng dấu gạch chéo ngược để thoát khỏi ký tự trong regexp là IMHO một ý tưởng tồi vì nó cũng thường được sử dụng để trích dẫn ký tự trong chuỗi, và do đó bạn thường phải sử dụng dấu gạch chéo ngược kép trong regexp). –

Các vấn đề liên quan