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ä
\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 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 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 )