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
- katso myös Kuinka muuntaa UTF-8-txt-tiedostot kaikkiin isoihin isoihin kirjaimiin bashissa?
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ä
\Lon GNU-laajennus. -
\Ltoimii toistaiseksi hyvällä tavalla. Valaise kohta, jonka yrität tehdä GNU-laajennukseksi - @JigarGandhi.
sedon 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.\Lei ole heidän joukossaan, ja GNU esitteli sen.sed(vastaa samaa operaattoria vakionaex/vi) eikä yleensä ole käytettävissä muissa toteutuksissa. - Huomaa, että jotkut
tr-toteutukset, kuten GNUträlä ’ ei toimi kunnolla monitavuisissa lokaleissa (suurin osa niistä on nykyään, kokeileecho STÉPHANE | tr '[:upper:]' '[:lower:]'esimerkiksi). GNU-järjestelmissä saatat suositellased-vaihtoehtoa taiawk’ stolower(). - 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 fileetcja 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
trsuuria 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 )