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?.......|