sed: nối hai dòng


11

Tôi có một tệp văn bản, trong đó các bản ghi được chia thành hai dòng. Tôi muốn đặt chúng trên một dòng. Các hồ sơ trông giống như thế này:

2013-07-29
 apt-get install git
2013-07-29
 apt-get install rsync
2013-07-31
 apt-get install nmap
2013-08-02
 apt-get install cifs-utils
2013-08-05
 apt-get install telnet

Tôi muốn có được những điều sau đây:

2013-07-29 apt-get install git
2013-07-29 apt-get install rsync
2013-07-31 apt-get install nmap
2013-08-02 apt-get install cifs-utils
2013-08-05 apt-get install telnet

Tôi đã thử với sed, nhưng tôi không thể phù hợp với hai dòng. Có một số mẹo trong sed, hoặc có một số công cụ tốt hơn?


Có vẻ như bạn muốn ghép hai dòng và bạn muốn tham gia vào dòng sau khi bạn tìm thấy một trận đấu. Đúng?
kurtm

Câu trả lời:


13
sed 'N;s/\n/ /'
  • N nối dòng đầu vào tiếp theo vào không gian mẫu
  • s/\n/ / thay thế dòng mới ngăn cách các dòng bằng một khoảng trắng.

hoặc là:

sed -n 'N;s/\n/ /;/regex/p'
  • -n vô hiệu hóa in tự động không gian mẫu như lệnh cuối cùng
  • /regex/p in dòng phù hợp với regex

Sử dụng công cụ gsửa đổi cho các thay thế trong trường hợp bạn đang tham gia nhiều hơn hai dòng, ví dụ N;N;N;s/\n/ /g.


điểm cần nhớ: sed hoạt động trên các dòng! tôi đã dành nhiều năm cố gắng để sed 's/>\n</>,</'làm việc cho đến khi tôi nhận ra rằng sed hoạt động trên các dòng tại một thời điểm. một tìm kiếm vịt con nhanh chóng và @peterph cho phép tôi giữ phần tóc còn lại của mình
bắc-bradley

6

Dường như các apt-getdòng có một khoảng trắng trước. Nói:

sed -e :a -e '$!N;s/\n / /;ta' -e 'P;D' inputfile

nên tạo ra kết quả mong muốn.

Ngoài ra, bạn cũng có thể sử dụng paste:

paste -d' ' - - < inputfile
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.