Làm cách nào tôi có thể in đầu ra đa dòng trên cùng một dòng?


Câu trả lời:


13

Bạn có thể xóa tất cả các lần xuất hiện của các ký tự khỏi một tập đã cho tr -d. Để loại bỏ ký tự dòng mới, sử dụng:

tr -d '\n'

Như mọi khi, bạn có thể sử dụng chuyển hướng đầu vào và đầu ra và đường ống để đọc hoặc ghi vào tệp và các quy trình khác.

Nếu bạn muốn giữ dòng mới cuối cùng, bạn chỉ cần thêm lại bằng echohoặc printf '\n', ví dụ:

cat file1 file2... | { tr -d '\n'; echo; } > output.txt

10

Nhiều cách. Để minh họa, tôi đã lưu ví dụ của bạn vào file:

$ cat file | tr -d '\n'
abcdefqwerty$ 
$ cat file | perl -pe 's/\n//'
abcdefqwerty$ 

Điều đó loại bỏ tất cả các ký tự dòng mới, bao gồm cả ký tự cuối cùng mặc dù. Thay vào đó, bạn có thể muốn làm:

$ printf "%s\n" "$(cat file | perl -pe 's/\n//')"
abcdefqwerty
$ printf "%s\n" "$(cat file | tr -d '\n')"
abcdefqwerty

Tôi nghĩ rằng printf+ cat+ perlkết hợp được tốt hơn nhiều xử lý qua perl -pe 's/\n//;END{printf "\n"}' input.txt quá trình đơn, không có lệnh thay thế và rối tung với dấu ngoặc kép, và không có UUOC. Có lẽ.
Sergiy Kolodyazhnyy

7

Bạn có thể dẫn đầu ra đa dòng của bạn thông qua awk

awk '{printf "%s",$0} END {print ""}'

hoặc sử dụng sed:

sed ':a;N;$!ba;s/\n//g'

Chạy ví dụ

$ echo -e "1\n2\n3\n4" | awk '{printf "%s",$0} END {print ""}'
1234
$ echo -e "1\n2\n3\n4" | sed ':a;N;$!ba;s/\n//g'              
1234

Đọc thêm: xóa ngắt dòng bằng AWK · serverfault.SE



2

Nếu bạn muốn sử dụng Perl cho việc này, bạn có thể sử dụng chompchức năng của nó :

perl -pe chomp

Một số chi tiết, cho những người quan tâm.

Bạn có thể vượt qua một hoặc nhiều tên tệp làm đối số tiếp theo.

perl -pe chomp file1 file2 file3

Trong một số trường hợp, bạn có thể không muốn làm điều đó , nhưng thay vào đó bạn có thể chuyển hướng hoặc chuyển hướng đến lệnh đó. (Những khả năng này - và cảnh báo đó - tất cả cũng áp dụng cho bất kỳ giải pháp nào khác perl -phoặc perl -ndựa trên.)

Vì vậy, nếu bạn muốn xử lý đầu ra từ việc chạy some-command:

some-command | perl -pe chomp

Điều này có khả năng nhanh hơn lệnh Perl trong câu trả lời của terdon . Các ký tự dòng mới (được đại diện bởi \n) chỉ xuất hiện ở cuối dòng trong tình huống này - bởi vì chúng là những gì Perl đang sử dụng để quyết định nơi mỗi dòng kết thúc. s/\n//tìm kiếm trong toàn bộ dòng cho dòng mới, trong khi chompchỉ loại bỏ dòng ở cuối (nếu có, vì dòng cuối cùng có thể có hoặc không có dòng).

Hiệu suất có thể không thực sự là lý do chính để thích chomp. Các perllệnh trong câu trả lời của terdon sẽ chỉ là hơi chậm, trừ khi bạn đang xử lý một tập tin rất lớn với những đường nét rất dài. Và nếu bạn cần tốc độ, cách của David Foerster có lẽ vẫn nhanh hơn. chomptuy nhiên, chính xác là công cụ phù hợp cho việc này nếu bạn đang sử dụng Perl và tôi nghĩ rằng mục đích của chompnó rõ ràng hơn là s/\n//. Cuối cùng, có lẽ không có câu trả lời khách quan nào là tốt hơn.

In một dòng mới cuối cùng.

Tuy nhiên, tôi khuyên bạn không nên sử dụng thay thế lệnh ( $( )) để đảm bảo một dòng mới được in. Trừ khi văn bản bạn đang xử lý ngắn, điều đó có thể khá chậm - nó phải thu thập tất cả văn bản cùng một lúc và sau đó in nó - và nó làm cho lệnh của bạn khó hiểu hơn. Thay vào đó, bạn có thể làm như David Foerster đã đề xuất và chạy echohoặc printf '\n'sau đó.

perl -pe chomp; echo

Nếu bạn đang chuyển từ hoặc (như David Foerster hiển thị) chuyển hướng từ lệnh đó, thì bạn có thể đặt nó vào { ;}để đầu ra của cả hai lệnh được thực hiện cùng nhau. Nếu bạn chỉ in nó đến thiết bị đầu cuối, thì bạn có thể chạy chính xác như được hiển thị ở trên. Điều này hoạt động ngay cả khi bạn đang chuyển hướng hoặc chuyển hướng đến lệnh, bởi vì echo/ printf '\n'không thực sự đọc bất kỳ đầu vào nào. Đó là, điều này hoạt động:

some-command | perl -pe chomp; echo

Trong khi ở đây bạn không thể đơn giản loại bỏ { ;}:

{ perl -pe chomp; echo; } | some-other-command

Hoặc, nếu bạn thích, bạn có thể tự perlin dòng mới cuối cùng. Giống như kèm theo các lệnh perlecholệnh { ;}, cách tiếp cận này hoạt động ngay cả khi bạn đang chuyển hướng hoặc chuyển hướng từ nó (và, giống như tất cả các cách tiếp cận, cách này cũng hoạt động khi bạn cũng chuyển sang nó):

perl -wpe 'chomp; END { print "\n" }'

Lưu ý rằng lệnh trong câu trả lời của terdon cũng hoạt động tốt với các phương pháp in dòng mới này. Ví dụ:

perl -pe 's/\n//'; echo
perl -pe 's/\n//; END { print "\n" }'

perl -wpe 'chomp; END { print "\n" } được cùng một quá trình, nhỏ lợi thế hơn thêm dấu tiếng vang
Sergiy Kolodyazhnyy

1

Sử dụng cách chỉ vỏ:

while IFS= read -r line || [ -n "$line" ]; do printf "%s"  "$line"; done < inputfile.txt

1

Câu trả lời này có một giải pháp cho vấn đề bạn đang cố gắng tạo ra: Tại sao bash xóa \ n trong $ (tệp cat)?

Nếu bạn gõ cat myfile.txtbạn sẽ thấy:

abc
def
ghi

Nhưng nếu bạn gõ echo $(cat myfile.txt)bạn sẽ thấy:

abc def ghi

Lưu ý phương pháp này chèn một khoảng trắng nơi các dòng mới riêng biệt được sử dụng. Điều này làm cho đầu ra dễ đọc hơn nhưng không tuân thủ nghiêm ngặt phạm vi câu hỏi của bạn.


0

Nếu bạn đang sử dụng Bash, thì bạn có thể làm điều đó mà không cần bất kỳ công cụ bên ngoài nào.

x=($(echo line1; echo line2))
echo "${x[@]}"

Kết quả:

line1 line2

Lệnh đầu tiên biến đầu ra đa dòng thành một mảng, lệnh thứ hai mở rộng mảng thành nhiều đối số trên một dòng.

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.