Convertiți conținutul fișierului în minuscule

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

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 GNU sed (se potrivește cu același operator în standard ex / vi) și, în general, nu este disponibil în alte implementări.
  • Rețineți că unele implementări tr precum GNU tr nu ‘ nu funcționează corect în locații multi-octet (majoritatea sunt în zilele noastre, încercați echo STÉPHANE | tr '[:upper:]' '[:lower:]' de exemplu). Pe sistemele GNU, puteți prefera varianta sed sau awk ‘ s tolower().
  • 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.

  • Această soluție este mult mai rapidă decât 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 )

    Lasă un răspuns

    Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *