2014-09-20 14 views
7

Hãy nói mẫu là chuỗi "Love"Nếu mô hình phù hợp xóa kí tự xuống dòng trong dòng

đầu vào

This is some text 
Love this or that 
He is running like a rabbit 

đầu ra

This is some text 
Love this or thatHe is running like a rabbit 

tôi đã nhận thấy rằng sed là rất khó chịu cho xóa ký tự dòng mới, ý tưởng nào?

+2

'sed' hoạt động trên một dòng tại một thời điểm. Mỗi khi nó bắt đầu làm việc trên một dòng nó sẽ loại bỏ dòng mới và đặt nó vào không gian mẫu. Không gian mẫu là nơi tất cả các hành động diễn ra. Một khi thay thế được thực hiện, nó đặt dòng mới và in tới 'STDOUT'. Để loại bỏ dòng mới, bạn cần sử dụng 'N' để nối dòng tiếp theo vào không gian mẫu được phân tách bằng' \ n' mà bạn có thể loại bỏ bằng cách thay thế. –

+0

Bạn có thích không gian giữa 'that' và' He'? – Jotne

Trả lời

12

Bạn có thể sử dụng này:

sed '/^Love/{N;s/\n//;}' love.txt 

chi tiết:

/^Love/ xác định dòng để điều trị, nếu bạn thích, bạn có thể sử dụng /[Ll]ove/ thay

N thêm dòng bên cạnh không gian mẫu. Sau lệnh này không gian mẫu chứa Love this or that\nHe is running like a rabbit

s/\n// thay thế kí tự xuống dòng

+0

chỉ có thể nói wow, thật dễ dàng khi được giải thích, là {} nececary để sử dụng phần tử chính N @ casimir-et-hippolyte – josifoski

+1

@josifoski: dấu ngoặc bao quanh các hành động cần làm khi điều kiện '/^Love/'là sự thật. –

1
$ awk '/Love/{printf "%s ",$0;next} 1' file 
This is some text 
Love this or that He is running like a rabbit 

Giải thích:

  • /Love/{printf "%s ",$0;next}

    Đối với dòng có chứa Love, dòng được in, qua printf, mà không có một dòng mới. awk sau đó bắt đầu lại trên đường dây next.

  • 1

    Đối với những ngành mà không bao gồm Love, họ được in thông thường (với một dòng mới). Lệnh 1 là viết tắt khó hiểu của awk để in bình thường.

+0

cảm ơn bạn đã giải pháp, trong một số tương lai sẽ mất một thời gian để học hỏi. Hiện tại, trên sed chủ yếu là – josifoski

1

Qua Perl,

$ perl -pe 's/^Love.*\K\n//' file 
This is some text 
Love this or thatHe is running like a rabbit 

\K vứt bỏ trước đây phù hợp với nhân vật.

HOẶC

$ perl -pe '/^Love/ && s/\n//' file 
This is some text 
Love this or thatHe is running like a rabbit 

Nếu một dòng bắt đầu với chuỗi Love, sau đó nó loại bỏ kí tự xuống dòng từ dòng đó.

+3

Sử dụng 'chomp' nếu chỉ cần xóa dòng mới. 'perl -pe 'chomp nếu/^ Love /' file' –

2

Perl:

$ perl -pe 's/^(Love[^\n]*)\n/\1/' file.txt 
This is some text 
Love this or thatHe is running like a rabbit 

Hoặc, nếu mục đích là chỉ tập trung vào các \n bạn có thể chomp dựa trên một mô hình:

$ perl -pe 'chomp if /^Love/' file.txt 
This is some text 
Love this or thatHe is running like a rabbit 
1

Dưới đây là một awk biến:

awk '{ORS=(/Love/?FS:RS)}1' file 
This is some text 
Love this or that He is running like a rabbi 

Thay đổi này ORS dựa trên mô hình


Dưới đây là một số khác awk

awk '{printf "%s%s",$0,(/Love/?FS:RS)}' file 
This is some text 
Love this or that He is running like a rabbit 

Nếu dòng có Love trong đó sử dụng FS như tách, nếu không sử dụng RS

này nên làm việc quá, nhưng sử dụng đầu tiên.

awk '{printf "%s"(/Love/?FS:RS),$0}' file 
+0

Nếu bạn không thích khoảng trống giữa hai dòng, sử dụng 'awk' {ORS = (/ Love /?" ": RS)} 1'' Ngay cả điều này có thể được sử dụng: 'awk 'ORS = (/ Love /? FS: RS)'' – Jotne

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