2011-12-15 32 views
7

Tôi muốn xóa tất cả ký tự dòng mới xảy ra sau chuỗi ký tự và thay thế bằng không gian tab. Nói ví dụ sample.txt của tôi là như sauXóa dòng mới sau một văn bản cụ thể qua bash/awk/sed/perl

foo 
bar bar bar bar some text 

Tôi muốn nó được

foo bar bar bar bar some text 

Làm thế nào để thực hiện điều này thông qua bash/awk/sed. Làm giúp.

+0

Điều gì đã xảy ra với "một số văn bản"? –

+0

Chỉ cần bỏ lỡ nó, không tạo sự khác biệt tôi đoán. do đó, đầu ra mong muốn phải là thanh thanh bar foo thanh một số văn bản – Greenhorn

Trả lời

11

Trong awk:

awk '/foo$/ { printf("%s\t", $0); next } 1' 
+0

Woot! Làm việc trong nháy mắt. Cảm ơn :) – Greenhorn

+0

Vâng, đó là một cách tiếp cận awk điển hình. Tôi đã viết một giải pháp sed dưới một nơi nào đó trong số các câu trả lời ... :) – DejanLekic

+4

Đối với những người tự hỏi về 1 ở cuối; chỉ cần đặt, nó dịch thành '{print $ 0}' sao cho các dòng * không * khớp với foo được in vì chúng có nghĩa là định dạng cơ bản là 'awk' {/ some_pat/{/ * nếu pat là true * /} {/ * nếu pat là false * /} '' –

2

Không phải tất cả các công cụ đều có thể thực hiện thay thế dòng mới. Perl có thể:

cat file.txt | perl -p -e 's/\n/ /g' 
+3

mmm 1. bạn đã bỏ lỡ yêu cầu 'foo'. 2. bạn đã bỏ lỡ yêu cầu _tab_ – sehe

2

Mmm. không chắc chắn này phù hợp với yêu cầu của bạn, nhưng tôi muốn làm điều này trong vim:

:g/^foo$/join 

Hoặc, nếu foo có thể là bất cứ nơi nào trên một dòng:

:g/foo$/join 

Tất nhiên, :%s/foo\n/foo\t/g sẽ làm độc đáo quá

+0

Đã thử điều này! Đã làm việc :) – Greenhorn

1

Điều này có thể làm việc cho bạn:

echo -e "foo\nbar bar bar bar some text"| sed '/foo$/{N;s/\n/\t/}' 
foo  bar bar bar bar some text 

Trên thực tế:

echo -e "foo\nbar bar bar bar some text"| sed '/foo$/N;s/\n/\t/' 
foo  bar bar bar bar some text 

Các giải pháp thứ hai kém hiệu quả hơn nhưng không nhiều!

1
perl -pe 's/foo\n/foo\t/g' temp2.txt 

dưới đây là thử nghiệm.

243> cat temp2.txt 
foo 
bar bar bar bar some text 
pearl[[email protected]].244> perl -pe 's/foo\n/foo\t/g' temp2.txt 
foo  bar bar bar bar some text 
0

Phiên bản sed trông giống như

#!/bin/sed -f 
/foo/{ 
N 
s/\n/\t/ 
} 

Nếu đây là tất cả các bạn muốn làm trong lệnh sed, bạn có thể đơn giản hóa ở trên để một lớp lót:

sed -e '/foo/N;y/\n/\t/' <sample.txt 

Giải thích: N nối thêm dòng mới và dòng đầu vào tiếp theo; y/\n/\t thay thế tất cả các dòng mới bằng tab hoặc s/\n/\t/ thay thế dòng mới đầu tiên bằng một tab.

Lưu ý rằng vì sed là hướng dòng, các dòng mới trong đầu vào được coi là dấu tách dòng chứ không phải là một phần của bất kỳ dòng nào (điều này ngược lại, ví dụ như Perl).

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