Muunna tiedoston sisältö pieniksi

Minulla on temp -tiedosto, jossa on pieniä ja isoja kirjaimia.

Syöttö

temp -tiedostoni sisältö:

 hi Jigar GANDHI jiga  

Haluan muuntaa kaikki ylemmät alemmiksi .

komento

Yritin seuraavaa komentoa:

sed -e "s/[A-Z]/[a-z]/g" temp 

mutta sain väärän tuloksen.

Output

Haluan sen seuraavasti:

hi jigar gandhi jiga 

Mitä korvaava -osan täytyy olla sed?

kommentit

Vastaa

Jos syötteesi sisältää vain ASCII-merkkejä, voit käyttää tr -tapaa:

tai (vähemmän helppo muistaa ja kirjoittaa IMO; mutta ei rajoittuen ASCII-latinalaisiin kirjaimiin, vaikka joissakin toteutuksissa, mukaan lukien GNU tr, rajoitetaan edelleen yksitavuisiin merkkeihin, joten UTF-8-kielialueilla, rajoittuen edelleen ASCII-kirjaimiin):

tr "[:upper:]" "[:lower:]" < input 

jos sinun on käytettävä sed:

sed "s/.*/\L&/g" < input 

(tässä oletetaan GNU-toteutus).

POSIX-sovelluksessa sed sinun on määritettävä kaikki translitteroinnit ja sitten voit valita mitkä kirjaimet, jotka haluat muuntaa:

sed "y/AǼBCΓDEFGH.../aǽbcγdefgh.../" < input 

Kanssa awk:

awk "{print tolower($0)}" < input 

Kommentit

  • Huomaa, että \L on GNU-laajennus.
  • \L toimii toistaiseksi hyvällä tavalla. Valaise kohta, jonka yrität tehdä GNU-laajennukseksi
  • @JigarGandhi. sed on Unix-komento. Eri järjestelmillä on erilaisia muunnelmia, joilla on erilainen käyttäytyminen ja d toiminnallisuus. Onneksi nykyään ’ on standardi, joka noudattaa parhaiten, joten voit luottaa kaikille yhteisiin ominaisuuksiin. \L ei ole heidän joukossaan, ja GNU esitteli sen. sed (vastaa samaa operaattoria vakiona ex / vi) eikä yleensä ole käytettävissä muissa toteutuksissa.
  • Huomaa, että jotkut tr -toteutukset, kuten GNU tr älä ’ ei toimi kunnolla monitavuisissa lokaleissa (suurin osa niistä on nykyään, kokeile echo STÉPHANE | tr '[:upper:]' '[:lower:]' esimerkiksi). GNU-järjestelmissä saatat suositella sed -vaihtoehtoa tai awk ’ s tolower().
  • Pieni korjaus: sed 's/.*/\L&/g' < input. \1 -viittaus sovitettuun alaosaan voitti ’ t, ellet määritä alimerkkiä sulkeilla, kuten wurtle tekee hänen. ’ on kuitenkin hieman puhtaampaa käyttää & edustamaan koko ottelua, kuten on esitetty

vastaus

Vimiä käyttämällä se on erittäin yksinkertaista:

$ vim filename gg0guGZZ 

Avaa tiedosto, gg siirtyy ensimmäiselle riville, 0, ensimmäiselle sarakkeelle. Kanssa guG , pienentää kaikkien merkkien kirjainkokoa tiedoston alareunaan asti. ZZ tallentaa ja poistuu.

Sen pitäisi käsitellä melkein mitä tahansa siihen heittämäsi; se ”Ohita numerot, se” käsittelee muita kuin ASCII-tiedostoja.

Jos haluat tehdä päinvastoin, muuta pienet kirjaimet isoiksi, vaihda u ulos U: gg0gUGZZ ja olet asetettu.

Kommentit

  • Lol ” erittäin yksinkertainen ”
  • tämä ei tietenkään ’ t skaalaa hyvin monille tiedostoille
  • @CoreyGoldberg vim file1 file2 fileetc ja sitten jotain sellaista kuin :bufdo gg0guG:w<CR> todennäköisesti toimi minkä tahansa määrän tiedostoja varten. Älä kuitenkaan ole testannut sitä!
  • @TankorSmash, joka ei silti ’ t skaalautu suureksi tiedostomääräksi

Vastaa

Pidän dd tästä itse.

<<\IN LC_ALL=C 2<>/dev/null \ dd conv=lcase hi Jigar GANDHI jiga IN 

… saa …

hi jigar ghandi jiga 

LC_ALL=C on suojata kaikki monitavuiset syötteet – vaikka monitavuisia isoja kirjaimia ei muuteta. Sama pätee (GNU) tr -sovellukseen – molemmat sovellukset ovat taipuvaisia syöttämään sekoittamista missä tahansa muussa kuin C-kielessä. iconv voidaan yhdistää jommankumman kanssa kattavan ratkaisun saamiseksi.

2>/dev/null uudelleenohjaus hylkää dd ”oletustilaraportin – ja sen peräkirjan. Ilman sitä dd seuraisi edellä olevan kaltaisen työn valmistumista ja tulostaisi tietoja, kuten kuinka monta tavua käsiteltiin jne.

Kommentit

  • Tämä ratkaisu on paljon nopeampi kuin tr suuria tiedostoja käsiteltäessä, kiitos!

Vastaa

Voit käyttää myös Perl 5 -ohjelmaa:

perl -pe "$_=lc" temp 

Vaihtoehto -p kertoo perl suorittamaan määritetyn lausekkeen kerran jokaiselle tuloriville tulostamalla tulos, ts. lopullinen arvo $_. -e osoittaa, että Ohjelma on seuraava argumentti, toisin kuin tiedosto, joka sisältää komentosarjan. lc muuntaa pieniksi. Ilman argumenttia se toimii $_. Ja $_= tallentaa sen uudelleen, jotta se tulostetaan.

Sen muunnelma olisi

perl -ne "print lc" temp 

Käyttämällä -n on kuin -p, paitsi että $_ ei lopulta tulosteta. Joten tallentamisen sijaan siihen muuttujaan sisällytän nimenomaisen tulostuslausekkeen.

Yksi Perlin etu, toisin kuin sed, on, että et tarvitse mitään GNU-laajennuksia. On hankkeita, joiden on oltava yhteensopivia muiden kuin GNU-ympäristöjen kanssa, mutta joille Perl on jo riippuvainen. Verrattuna tr -ohjelmaan voi olla, että Perl lc voidaan tehdä helpommin alueellisesta tiedosta. Katso lisätietoja perllocale -sivulta.

Vastaa

Sinun on siepattava vastaava kuvio ja käytä sitä sitten korvaavalla muokkaimella:

sed "s/\([A-Z]\)/\L\1/g" temp 

\(...\) ”sieppaa” kun liitetään vastaava teksti, ensimmäinen sieppaus menee \1, seuraavaan \2 jne. -kohdan viereen. Numerointi on avaussulkeiden mukaan, jos sisäkkäisiä sieppauksia.

\L muuntaa kaapatun kuvion pieniksi kirjaimiksi, myös \U isoille kirjaimille .

Kommentit

  • sinun ei tarvitse tehdä tätä – koko kuvio on aina kiinni &
  • Totta, mutta silloin olisin menettänyt tilaisuuden selittää otteluiden kaappaamista 🙂

Vastaa

MvG: n vastauksen lisäksi voit käyttää myös Perl 6:

perl6 -pe .=lc temp

Täällä $ _ on implisiittinen, ja sinun ei tarvitse yksittäisiä lainausmerkkejä suojataksesi sitä kuoren laajentumiselta ($ _ on erityinen Bash-parametri; katso: https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html )

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *