Am temp
fișier cu câteva conținuturi minuscule și majuscule.
Intrare
Conținutul fișierului meu temp
:
hi Jigar GANDHI jiga
Vreau să convertesc toate superioare la inferioare .
Comandă
Am încercat următoarea comandă:
sed -e "s/[A-Z]/[a-z]/g" temp
dar am obținut rezultate greșite.
Ieșire
Îl doresc ca:
hi jigar gandhi jiga
Ce trebuie să fie în partea substitut de argument pentru sed
?
Comentarii
- Vezi și Cum se convertesc fișierele txt UTF-8 în toate majusculele din bash?
Răspuns
Dacă intrarea dvs. conține numai caractere ASCII, puteți utiliza tr
ca:
sau (mai puțin ușor de reținut și de tastat IMO; dar nu limitat la literele latine ASCII, deși în unele implementări, inclusiv GNU tr
, încă limitat la caracterele cu un singur octet, deci în localizările UTF-8, limitat încă la literele ASCII):
tr "[:upper:]" "[:lower:]" < input
dacă trebuie să utilizați sed
:
sed "s/.*/\L&/g" < input
(aici presupunând implementarea GNU).
Cu POSIX sed
, ar trebui să specificați toate transliterările și apoi puteți alege care litere pe care doriți să le convertiți:
sed "y/AǼBCΓDEFGH.../aǽbcγdefgh.../" < input
Cu awk
:
awk "{print tolower($0)}" < input
Comentarii
- Rețineți că
\L
este o extensie GNU. -
\L
funcționează bine pentru mine până acum. Înțelegeți faptul că încercați să faceți extensia GNU - @JigarGandhi.
sed
este o comandă Unix. Diferite sisteme au variante diferite cu comportament diferit și d funcționalitate. Din fericire, în zilele noastre, există ‘ un standard la care se conformează cel mai mult, astfel încât să puteți conta pe un set minim de caracteristici comune tuturor.\L
nu se află printre ele și a fost introdus de GNUsed
(se potrivește cu același operator în standardex
/vi
) și, în general, nu este disponibil în alte implementări. - Rețineți că unele implementări
tr
precum GNUtr
nu ‘ nu funcționează corect în locații multi-octet (majoritatea sunt în zilele noastre, încercațiecho STÉPHANE | tr '[:upper:]' '[:lower:]'
de exemplu). Pe sistemele GNU, puteți prefera variantased
sauawk
‘ stolower()
. - Corecție ușoară:
sed 's/.*/\L&/g' < input
. Referința\1
la subșirul potrivit nu a funcționat ‘ t decât dacă specificați șirul cu paranteză așa cum face wurtle în a lui. Cu toate acestea, este ‘ ușor mai curat să folosiți&
pentru a reprezenta întreaga potrivire, așa cum se arată
Răspuns
Folosind vim, este foarte simplu:
$ vim filename gg0guGZZ
Deschide fișierul, gg
merge la prima linie, 0
, prima coloană. Cu guG
, scade majuscula cu toate caracterele până la partea de jos a fișierului. ZZ
salvează și iese.
Ar trebui să gestioneze aproape orice aruncați asupra acestuia; „Voi ignora numerele, se va descurca fără ASCII.
Dacă doriți să faceți opusul, transformați literele mici cu majuscule în majuscule, schimbați u
pentru un U
: gg0gUGZZ
și sunteți setat.
Comentarii
- Lol ” super simplu ”
- evident că nu ‘ t scala bine pentru multe fișiere
- @CoreyGoldberg
vim file1 file2 fileetc
și apoi ceva de genul:bufdo gg0guG:w<CR>
ar probabil funcționează pentru orice număr de fișiere. Totuși, nu l-am testat! - @TankorSmash care încă nu ‘ t se scala la un număr mare de fișiere
Răspuns
Îmi place dd
pentru asta, eu.
<<\IN LC_ALL=C 2<>/dev/null \ dd conv=lcase hi Jigar GANDHI jiga IN
… devine …
hi jigar ghandi jiga
LC_ALL=C
este de a proteja orice multibyte din intrare – deși capitalurile multibyte nu vor fi convertite. Același lucru este valabil și pentru (GNU) tr
– ambele aplicații sunt predispuse la intrarea în orice locație non-C. iconv
poate fi combinat cu oricare pentru o soluție cuprinzătoare.
Redirecția 2>/dev/null
elimină raportul de stare implicit al dd
– și stderr-ul său. Fără el va urma finalizarea unei lucrări, cum ar fi cele de mai sus, cu informații de tipărire, cum ar fi câte octeți au fost procesate etc. etc.
tr
atunci când gestionați fișiere mari, mulțumesc! Răspundeți
Puteți folosi și Perl 5:
perl -pe "$_=lc" temp
Opțiunea -p
spune perl pentru a rula expresia specificată o dată pentru fiecare linie de intrare, imprimând rezultatul, adică valoarea finală a $_
. -e
indică faptul că programul va fi următorul argument, spre deosebire de un fișier care conține scriptul. lc
convertește în minuscule. Fără argument, acesta va funcționa pe $_
. Și $_=
o salvează din nou, astfel încât să fie tipărită.
O variantă a acesteia ar fi
perl -ne "print lc" temp
Utilizarea -n
este ca -p
cu excepția faptului că $_
nu va fi imprimat la final. Deci, în loc să economisesc la acea variabilă, includ o declarație de imprimare explicită.
Un avantaj al Perl în contrast cu sed este că nu aveți nevoie de extensii GNU. Există proiecte care trebuie să fie compatibile cu medii non-GNU, dar care au, de asemenea, deja dependență de Perl. Comparativ cu tr
, s-ar putea ca Perl lc
să poată fi mai ușor sensibilizat la localizare. Consultați pagina de manual perllocale
pentru detalii.
Răspuns
Trebuie să capturați modelul potrivit și apoi folosiți-l în înlocuirea cu un modificator:
sed "s/\([A-Z]\)/\L\1/g" temp
\(...\)
„captează” care include textul potrivit, prima captură merge la \1
, următoarea la \2
etc. Numerotarea este în funcție de parantezele de deschidere în cazul capturi imbricate.
\L
convertește modelul capturat în minuscule, există și \U
pentru majuscule .
Comentarii
- nu trebuie să faceți acest lucru – întregul model este întotdeauna prins în
&
- Este adevărat, dar aș fi pierdut ocazia de a explica capturarea meciurilor 🙂
Răspuns
În plus față de răspunsul lui MvG, puteți utiliza și Perl 6:
perl6 -pe .=lc temp
Aici $ _ este implicit și nu aveți nevoie de ghilimele unice pentru a-l proteja de expansiunea de către shell ($ _ fiind un parametru special Bash; vezi: https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html )