Puncte:1

Șirul Bash împărțit de delimitator constrâns de numărul de caractere

drapel in

Vreau să împart un text lung, separat de spații prin bash, dar nu reușesc. Comanda de mai jos se împarte în caractere, dar nu în delimitatori.

ecou „Vulpea iute a sărit peste câinele leneș” | pliază -w 10
ecou „Vulpea iute a sărit peste câinele leneș” | sed -e 's/.\{9\}/&\n/g'

Ar fi frumos să-l aveți pentru o interacțiune cu utilizatorul.

Sintaxa de intrare

format_text 10 „Vulpea iute a sărit peste câinele leneș”

Ieșire:

Rapidul 
a sărit vulpea 
peste 
caine lenes

Trebuie să observați că a treia linie ar tăia litera "l" de la "leneș" dacă nu pentru regula de spațiere.

Actualizați: Rezultatul actual este bun. Există o problemă cu slicerul de lucru pe care nu o pot obține singur: nu rupe cuvintele înainte de depășirea limitei.

#!/bin/bash

printHeader () {
    declară -i lungime_linie=$3
    
    # Garduri superioare și inferioare 
    local upper_command="printează \"$1\" *" 
    local upper_fence="$(python -c "$upper_command $line_length")"
    
    local lower_command="printează \"$2\" *"
    local lower_fence="$(python -c "$lower_command $line_length")"
    
    # Taie cuvintele după un număr de caractere
    local regex_counter="s/(.{$line_length}) /\1\n/g"
    
    # Linie completă cu puncte și o țeavă
    local res="$line_length - lungime"
    local repeat_pattern='$(repeat res \".\"; ecou)'
    local fill_command="{res=($res); printf \"%s%s|\n\", $0, $repeat_pattern}"

    echo „$upper_fence”

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

    echo „$lower_fence”
}

printHeader "#" "#" 10 "Vulpea rapidă a sărit peste câinele leneș"

Ieșire curentă fără indicativ final:

##########
Vulpea iute
a sărit peste
câinele leneș
##########
Bruno Henrique Peixoto avatar
drapel in
Am adăugat exemplele așa cum ați sugerat
Bruno Henrique Peixoto avatar
drapel in
Superba intrebare! Este o întrebare deschisă pentru problemă. Putem eticheta linia cu a
Bruno Henrique Peixoto avatar
drapel in
Dar să luăm cazul în care numărul de caractere este mai mare decât cel mai mare cuvânt. Pare rezonabil pentru un text în limbaj natural,
bac0n avatar
drapel cn
`| fmt -w 11` .. (cred că trebuie să numeri și linia nouă)
Bruno Henrique Peixoto avatar
drapel in
Răspuns sublim. E deja ok pentru mine! În cazul în care vreau să pun un delimitator pentru a indica limita de linie, codul se schimbă mult?
Puncte:2
drapel cn
sed -r 's/([^ .]+ [^ .]+) /\1\n/g' <<< "Vulpea iute a sărit peste câinele leneș"
Rapidul
a sărit vulpea
peste
caine lenes

Setul de caractere [^ .]+ înseamnă unul sau mai multe + personaje de orice fel . excluzând ^ spații albe. Deci grupul de captură ([^ .]+ [^ .]+) potriviri pentru modele ca sfoară de sfoară. Întreaga expresie regulată are un spațiu alb suplimentar la sfârșit ([^ .]+ [^ .]+) (ar putea fi inclusă în grupul de captură pentru a-l păstra).

Cu sed prin folosirea înlocuitorului s comanda înlocuim modelul potrivit cu conținutul primului grup de captură \1 și un nou caracter de linie \n în loc de spațiul alb. Pe lângă steag g repetăm ​​comanda până la sfârșitul fiecărei linii. The -r opțiunea activează expresiile regulate extinse.


Actualizare - acesta este răspunsul real:

sed -r 's/(.{8}) /\1\n/g' <<< "De unde știm că se va potrivi cu numărul predefinit de caractere?"
Cum facem
stiu ca este
merge la
se potrivesc
predefinite
Un numar de
personaje?

În acest exemplu, capturam șiruri cu lungimea de cel puțin 8 caractere (inclusiv spații albe) urmate de un spațiu alb. Putem verifica lungimea reală a liniilor de ieșire astfel:

sed -r 's/(.{8}) /\1\n/g' <<< "De unde știm că se va potrivi cu numărul predefinit de caractere?" \
    | awk '{lungime tipărire}'
9
10
8
9
11
9
11

Și cu ajutorul răspunsurilor la întrebare Cum se utilizează printf pentru a imprima un caracter de mai multe ori? [pată] putem obține rezultatul dorit.

sed -r 's/(.{8}) /\1\n/g' <<< "De unde știm că se va potrivi cu numărul predefinit de caractere?" \
    | awk '{odihnă=(12 - lungime); printf "%s%s|\n", $0, substr(".........", 1, rest)}'
Cum facem...|
stiu ca este..|
merg la....|
se potrivesc cu...|
predefinite.|
număr de...|
personaje?.|

În cazul în care doriți să spargeți cuvintele, eliminați spațiul alb final din expresia regulată de mai sus /(.{8})/. Iată un exemplu în care lungimea maximă a liniei va fi de exact 10 caractere sau mai puțin, unde a doua sed comanda va tăia spațiile albe din jurul fiecărei linii noi.

sed -r 's/(.{10})/\1\n/g' <<< "De unde știm că se va potrivi cu numărul predefinit de caractere?" \
    | sed -r 's/(^ | $)//g' \
    | awk '{odihnă=(10 - lungime); printf "%s%s|\n", $0, substr(".........", 1, rest)}'
Cum facem.|
stiu ca este|
merg la..|
se potrivesc cu.|
predefinit|
d numărul o|
f caracter|
rs?.......|
Bruno Henrique Peixoto avatar
drapel in
De unde știm că se va potrivi cu numărul predefinit de caractere?
pa4080 avatar
drapel cn
Bună, @BrunoHenriquePeixoto. Am actualizat răspunsul cu o mică glumă cu întrebarea ta.
Bruno Henrique Peixoto avatar
drapel in
GROZAV! Ultima dorință, geniu. Poți pune o cireșă deasupra delimitând ultimul caracter (fie {max_val}, fie {max_val+1}).Poate fi vreun simbol | sau #, nu contează.
pa4080 avatar
drapel cn
@BrunoHenriquePeixoto, nu am înțeles această cerință. Probabil că aveți nevoie de o a doua expresie ca: `sed -r -e 's/(.{8}) /\1\n/g' -e 's/(.)$/\|\1/'` dar eu nu sunt sigur. Sau dacă doriți să modificați fiecare linie nouă, cel mai leneș este printr-o a doua procesare ca: `sed -r 's/(.{8}) /\1\n/g' in-file.txt | sed -r 's/(.)$/\|\1/'`
Bruno Henrique Peixoto avatar
drapel in
Exemplu: Având în vedere numele dvs. de profil „pa4080” (6 cifre), numărul maxim de 10 cifre de linie și țeava de delimitare „|” și punctele pentru spațiul final, rezultatul trebuie să fie „pa4080....|”, fără dublul citate.
pa4080 avatar
drapel cn
@BrunoHenriquePeixoto, vă rugăm să verificați actualizarea :)
Bruno Henrique Peixoto avatar
drapel in
Ar trebui să fii în sala faimei din stack overflow
Bruno Henrique Peixoto avatar
drapel in
Fragmentul de substr pare puțin neglijent. Unele rutine repetate se potrivesc mai bine. Am făcut o treabă grozavă!
Bruno Henrique Peixoto avatar
drapel in
Există o problemă cu sed-ul pe care l-am implementat. Aruncă o privire la corpul principal al postării.
pa4080 avatar
drapel cn
Bună, @BrunoHenriquePeixoto, dacă doriți să despărțiți cuvântul, încercați să eliminați spațiul alb final din expresia regex: `/(.{8}) /` => `/(.{8})/`. Am adăugat o actualizare la răspuns.
Bruno Henrique Peixoto avatar
drapel in
Vreau să dau mai multe cote la răspuns! :(! MULȚUMIRI
Bruno Henrique Peixoto avatar
drapel in
voturi, îmbrățișări, bani, calorii, credit, stele, orice contează
pa4080 avatar
drapel cn
@BrunoHenriquePeixoto, poți doar să-l votezi făcând clic pe săgeata în sus :)
Bruno Henrique Peixoto avatar
drapel in
Voi vota pozitiv în fiecare zi din viața mea.
Bruno Henrique Peixoto avatar
drapel in
Recompensa ta: https://github.com/brunolnetto/engage

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.