Có một phương pháp để in đầu ra nhiều dòng (đầu ra đơn) trên cùng một dòng không?
Ví dụ: nếu đầu ra là:
abc
def
qwerty
Có thể in:
abcdefqwerty
Có một phương pháp để in đầu ra nhiều dòng (đầu ra đơn) trên cùng một dòng không?
Ví dụ: nếu đầu ra là:
abc
def
qwerty
Có thể in:
abcdefqwerty
Câu trả lời:
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 echo
hoặc printf '\n'
, ví dụ:
cat file1 file2... | { tr -d '\n'; echo; } > output.txt
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
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'
$ 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
Cũng your_command | paste -sd ''
bảo tồn các dòng mới.
Nếu bạn muốn sử dụng Perl cho việc này, bạn có thể sử dụng chomp
chức năng của nó :
perl -pe chomp
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 -p
hoặc perl -n
dự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 chomp
chỉ 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 perl
lệ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. chomp
tuy 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 chomp
nó 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.
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 echo
hoặ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ự perl
in dòng mới cuối cùng. Giống như kèm theo các lệnh perl
và echo
lệ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
Sử dụng cách chỉ vỏ:
while IFS= read -r line || [ -n "$line" ]; do printf "%s" "$line"; done < inputfile.txt
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.txt
bạ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.
printf
+cat
+perl
kết hợp được tốt hơn nhiều xử lý quaperl -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ẽ.