Bash:
Tiedostojen muokkaaminen paikan päällä komentorivin yhden rivin komennoilla
Miten:
Kun on kyse tiedostojen paikan päällä tapahtuvasta muokkaamisesta Bashin avulla, kaksi merkittävää työkalua nousee esiin: sed
ja awk
. Tutkitaan, miten näitä tehokkaita työkaluja käytetään joillakin koodiesimerkeillä.
sed
käyttö yksinkertaiseen tekstin korvaamiseen
Seuraava komento korvaa ensimmäisen esiintymän “text1” tekstillä “text2” tiedostossa file.txt
:
sed -i 's/text1/text2/' file.txt
Globaalia korvaamista (kaikki esiintymät) varten lisäisit loppuun g
:
sed -i 's/text1/text2/g' file.txt
Muokataksesi useita tiedostoja kerralla:
sed -i 's/text1/text2/g' file1.txt file2.txt file3.txt
awk
käyttö monimutkaisempiin manipulaatioihin
awk
on toinen työkalu, joka loistaa ohjelmointikyvyillään, erityisesti tekstinkäsittelyssä, joka sisältää kenttäpohjaista dataa.
Muuttaen jokaisen rivin toisen kentän newValue
arvoon data.csv
-tiedostossa, pilkulla erotettuna:
awk -i inplace -F, '{$2="newValue"; print $0}' OFS=, data.csv
Varmuuskopioi ennen kuin hyppäät
Käytännön neuvona: luo aina varmuuskopio ennen paikan päällä tapahtuvaa muokkausta. sed
helpottaa tätä -i
-vaihtoehdon avulla, jota seuraa suffiksi varmuuskopion luomiseksi.
sed -i.bak 's/text1/text2/g' file.txt
Tämä komento luo alkuperäisen file.txt
-tiedoston varmuuskopion nimellä file.txt.bak
ennen korvauksen suorittamista.
Syvä sukellus
Kyky muokata tiedostoja suoraan komentoriviltä syntyi luonnollisena jatkona Unixin filosofialle: käyttäjien voimaannuttaminen tehokkaaseen datan hallintaan ja käsittelyyn mahdollisimman vähin näppäimistön painalluksin. Tämä voima sisältää kuitenkin varjopuolia.
Historiallinen konteksti
Unix-työkalut kuten sed
ja awk
ovat olleet osa Unixin alkuajoista lähtien, luotu osana sen työkalupakki-filosofiaa, joka keskittyy erikoistuneisiin, yhdisteltäviin komentoihin. Niiden sisällyttäminen Unixin asevarastoon oli vastaus tarpeeseen tehokkaasta tekstinkäsittelystä maisemassa, jota hallitsevat komentorajapinnat.
Vaihtoehdot
Vaikka sed
ja awk
ovat tehokkaita, ne eivät ole ainoita vaihtoehtoja. Perl ja Python esimerkiksi tarjoavat komentorivivaihtoehdot (-p
ja -i
, vastaavasti), jotka mahdollistavat samankaltaisen paikan päällä tapahtuvan muokkauskyvyn, mahdollisesti selkeämmällä syntaksilla monimutkaisiin operaatioihin.
perl -pi -e 's/text1/text2/g' file.txt
python -c "import fileinput, sys; [sys.stdout.write(line.replace('text1', 'text2')) for line in fileinput.input(files='file.txt', inplace=True)]"
Kullakin vaihtoehdolla on omat vahvuutensa: Perl yhden rivin kyvyt ovat valtavat, ja Pythonin syntaksi on mahdollisesti saavutettavampi niille, jotka eivät ole syvästi perehtyneet Unixin tekstinkäsittelytyökaluihin.
Toteutuksen yksityiskohdat
Paikan päällä tapahtuva muokkaus ei teknisessä mielessä ole todella “paikan päällä”. Sekä sed -i
että awk -i inplace
toimivat luomalla väliaikaisen tiedoston, johon käsitelty tulos tallennetaan ennen alkuperäisen tiedoston korvaamista. Tämä lähestymistapa varmistaa, että tiedosto ei vahingoitu, jos prosessi keskeytyy. Seuraukset ovat lähinnä resursseissa ja oikeuksissa: sinulla on oltava tarpeeksi levytilaa väliaikaistiedostolle ja oikeudet luoda tiedostoja kohdetiedostosi hakemistoon.
Vaikka tehokkaita, paikan päällä tapahtuvia muokkauskomentoja on käytettävä varoen. Huonosti sijoitettu regex voi johtaa datan menetykseen, mikä korostaa varmuuskopioiden tärkeyttä. Mahdollisista ansakuopista huolimatta näiden komentojen hallitseminen voi merkittävästi parantaa kykyäsi suorittaa nopeita, tehokkaita tiedostomuokkauksia suoraan komentoriviltä, ilmentäen Unixin filosofiaa yksinkertaisten, tehokkaiden työkalujen käytöstä monimutkaisten tehtävien suorittamiseen.