Điểm:1

Chuỗi Bash được phân tách bằng dấu phân cách bị ràng buộc bởi số lượng ký tự

lá cờ in

Tôi muốn tách một văn bản dài được phân tách bằng dấu cách thông qua bash, nhưng tôi không thành công. Lệnh bên dưới chia thành các ký tự, nhưng không phải là dấu phân cách.

echo "Con cáo nhanh nhẹn nhảy qua con chó lười biếng" | gấp -w 10
echo "Con cáo nhanh nhẹn nhảy qua con chó lười biếng" | sed -e 's/.\{9\}/&\n/g'

Sẽ thật tuyệt nếu có nó cho một số tương tác bash của người dùng.

cú pháp đầu vào

format_text 10 "Con cáo nhanh nhẹn nhảy qua con chó lười biếng"

Đầu ra:

Sự nhanh chóng 
cáo nhảy 
qua 
con chó lười biếng

Bạn phải chú ý rằng dòng thứ ba sẽ cắt chữ "l" từ "lười" đi nếu không phải vì quy tắc giãn cách.

Cập nhật: Kết quả hiện tại là tốt, Có một số vấn đề với bộ chia công việc mà tôi không thể tự xử lý: nó không ngắt từ trước khi vượt qua giới hạn.

#!/bin/bash

printHeader() {
    khai báo -i line_length=$3
    
    # Hàng rào trên và dưới 
    local upper_command="print \"$1\" *" 
    local upper_fence="$(python -c "$upper_command $line_length")"
    
    local Lower_command="print \"$2\" *"
    local Lower_fence="$(python -c "$lower_command $line_length")"
    
    # Cắt từ bằng một số bộ đếm ký tự
    cục bộ regex_counter="s/(.{$line_length}) /\1\n/g"
    
    # Hoàn thành dòng với các dấu chấm và một đường ống
    local res="$line_length - length"
    local repeat_pattern='$(repeat res \".\"; echo)'
    local fill_command="{res=($res); printf \"%s%s|\n\", $0, $repeat_potype}"

    tiếng vang "$upper_fence"

    sed -r "$regex_counter" <<< $4

    tiếng vang "$lower_fence"
}

printHeader "#" "#" 10 "Con cáo nhanh trí nhảy qua con chó lười"

Đầu ra hiện tại không có mã thông báo cuối cùng:

##########
cáo nhanh
Nhảy qua
con chó lười biếng
##########
Bruno Henrique Peixoto avatar
lá cờ in
Tôi đã thêm các ví dụ như bạn đề xuất
Bruno Henrique Peixoto avatar
lá cờ in
Câu hỏi tuyệt vời! Đó là một câu hỏi mở cho vấn đề. Chúng tôi có thể gắn thẻ dòng với một
Bruno Henrique Peixoto avatar
lá cờ in
Nhưng hãy lấy trường hợp số lượng ký tự lớn hơn từ lớn nhất. Nó có vẻ hợp lý cho một văn bản ngôn ngữ tự nhiên,
bac0n avatar
lá cờ cn
`| fmt -w 11` .. (nghĩ cũng phải đếm dòng mới)
Bruno Henrique Peixoto avatar
lá cờ in
Câu trả lời tuyệt vời. Nó đã ổn với tôi rồi! Trong trường hợp tôi muốn đặt một số dấu phân cách để biểu thị giới hạn dòng, mã có thay đổi nhiều không?
Điểm:2
lá cờ cn
sed -r 's/([^ .]+ [^ .]+) /\1\n/g' <<< "Con cáo nhanh trí nhảy qua con chó lười"
Sự nhanh chóng
cáo nhảy
qua
con chó lười biếng

bộ ký tự [^ .]+ có nghĩa là một hoặc nhiều + nhân vật của bất kỳ loại . loại trừ ^ khoảng trắng. Vì vậy, nhóm chụp ([^ .]+ [^ .]+) phù hợp với các mẫu như chuỗi chuỗi. Toàn bộ biểu thức chính quy có thêm khoảng trắng ở cuối ([^ .]+ [^ .]+) (nó có thể được đưa vào nhóm chụp để bảo tồn nó).

Với sed bằng cách sử dụng thay thế S lệnh chúng tôi thay thế mẫu phù hợp bằng nội dung của nhóm chụp đầu tiên \1 và một ký tự dòng mới \N thay vì khoảng trắng. Bằng lá cờ g chúng tôi lặp lại lệnh đến cuối mỗi dòng. Các -r tùy chọn kích hoạt các biểu thức chính quy mở rộng.


Cập nhật - đây là câu trả lời thực tế:

sed -r 's/(.{8}) /\1\n/g' <<< "Làm sao chúng tôi biết nó sẽ khớp với số lượng ký tự được xác định trước?"
Làm thế nào để chúng ta
biết nó là
sẽ
phù hợp với
được xác định trước
số lượng
nhân vật?

Trong ví dụ này, chúng tôi chụp các chuỗi có độ dài ít nhất 8 ký tự (bao gồm cả khoảng trắng) theo sau là khoảng trắng. Chúng ta có thể kiểm tra độ dài thực tế của các dòng đầu ra theo cách như sau:

sed -r 's/(.{8}) /\1\n/g' <<< "Làm sao chúng tôi biết nó sẽ khớp với số lượng ký tự được xác định trước?" \
    | awk '{độ dài in}'
9
10
8
9
11
9
11

Và nhờ sự giúp đỡ của các câu trả lời của câu hỏi Làm cách nào để sử dụng printf để in một ký tự nhiều lần? [gặp] chúng ta có thể đạt được kết quả mong muốn.

sed -r 's/(.{8}) /\1\n/g' <<< "Làm sao chúng tôi biết nó sẽ khớp với số lượng ký tự được xác định trước?" \
    | awk '{phần còn lại = (12 - độ dài); printf "%s%s|\n", $0, chất nền(".........", 1, phần còn lại)}'
Làm thế nào để chúng ta...|
biết rồi..|
sắp....|
phù hợp với...|
được xác định trước.|
số...|
ký tự?.|

Trong trường hợp bạn muốn ngắt các từ, hãy xóa khoảng trắng cuối cùng khỏi biểu thức chính quy ở trên /(.{8})/. Dưới đây là một ví dụ trong đó độ dài dòng tối đa sẽ chính xác là 10 ký tự trở xuống, trong đó ký tự thứ hai sed lệnh sẽ cắt các khoảng trắng xung quanh mỗi dòng mới.

sed -r 's/(.{10})/\1\n/g' <<< "Làm sao chúng tôi biết nó sẽ khớp với số lượng ký tự được xác định trước?" \
    | sed -r 's/(^ | $)//g' \
    | awk '{phần còn lại = (10 - độ dài); printf "%s%s|\n", $0, chất nền(".........", 1, phần còn lại)}'
Làm thế nào để chúng tôi.|
biết nó là |
đi tới..|
phù hợp với.|
xác định trước|
d số o|
nhân vật f|
rs?.......|
Bruno Henrique Peixoto avatar
lá cờ in
Làm thế nào để chúng tôi biết nó sẽ khớp với số lượng ký tự được xác định trước?
pa4080 avatar
lá cờ cn
Xin chào, @BrunoHenriquePeixoto. Tôi đã cập nhật câu trả lời với một trò đùa nhỏ về câu hỏi của bạn.
Bruno Henrique Peixoto avatar
lá cờ in
TUYỆT VỜI! Điều ước cuối cùng, thiên tài. Bạn có thể đặt một quả anh đào lên trên cùng bằng cách phân tách ký tự cuối cùng ({max_val} hoặc {max_val+1}).Có thể là một số biểu tượng | hoặc #, không quan trọng.
pa4080 avatar
lá cờ cn
@BrunoHenriquePeixoto, tôi không hiểu yêu cầu này. Có lẽ bạn cần một biểu thức thứ hai như sau: `sed -r -e 's/(.{8}) /\1\n/g' -e 's/(.)$/\|\1/'` but I 'tôi không chắc. Hoặc nếu bạn muốn sửa đổi từng dòng mới, cách lười biếng nhất là xử lý lần thứ hai như sau: `sed -r 's/(.{8}) /\1\n/g' in-file.txt | sed -r 's/(.)$/\|\1/'`
Bruno Henrique Peixoto avatar
lá cờ in
Ví dụ: Đặt tên hồ sơ của bạn là "pa4080" (6 chữ số), số lượng tối đa 10 chữ số dòng và dấu phân cách '|' và dấu chấm cho khoảng trắng ở cuối, đầu ra phải là "pa4080....|", không có dấu kép dấu ngoặc kép.
pa4080 avatar
lá cờ cn
@BrunoHenriquePeixoto, vui lòng kiểm tra bản cập nhật :)
Bruno Henrique Peixoto avatar
lá cờ in
Bạn nên ở trên đại sảnh danh vọng
Bruno Henrique Peixoto avatar
lá cờ in
Đoạn mã nền có vẻ hơi cẩu thả. Một số thói quen lặp lại phù hợp hơn. Chúng tôi đã làm một công việc tuyệt vời!
Bruno Henrique Peixoto avatar
lá cờ in
Đã xảy ra sự cố với sed mà chúng tôi đã triển khai. Hãy nhìn vào phần chính của bài viết.
pa4080 avatar
lá cờ cn
Xin chào, @BrunoHenriquePeixoto, nếu bạn muốn ngắt từ, hãy thử xóa khoảng trắng cuối cùng khỏi biểu thức chính quy: `/(.{8}) /` => `/(.{8})/`. Tôi đã thêm một bản cập nhật cho câu trả lời.
Bruno Henrique Peixoto avatar
lá cờ in
Tôi muốn cung cấp thêm cotes cho câu trả lời! :(! CẢM ƠN
Bruno Henrique Peixoto avatar
lá cờ in
phiếu bầu, những cái ôm, tiền bạc, lượng calo, tín dụng, ngôi sao, bất cứ điều gì được tính
pa4080 avatar
lá cờ cn
@BrunoHenriquePeixoto, bạn chỉ cần nâng cấp nó bằng cách nhấp vào mũi tên lên :)
Bruno Henrique Peixoto avatar
lá cờ in
Tôi sẽ upvote mỗi ngày trong cuộc sống của tôi.
Bruno Henrique Peixoto avatar
lá cờ in
Phần thưởng của bạn: https://github.com/brunolnetto/engage

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.