Kuinka löytää ja korvata merkkijono käyttämättä komentoa Sed?

Kuten me kaikki tiedämme, sed on erittäin tehokas etsimään ja korvaamaan merkkijono, esimerkiksi etsimään ”a” ja korvaa se nimellä ”b”: sed "s/a/b/g".

Onko mahdollista tehdä tämä muulla komennolla tai komentosarjakomennolla sed?

Tämä koskee rajattua linux-järjestelmää televisioon, jossa ei ole komentoa sed. Joten minun on käytettävä muita komentoja tai komentosarjoja sed "s/a/b/g". –

kommentit

  • -kohdan sijaan. vain säännölliseen lausekkeeseen perustuva korvaaminen. Jokainen työkalu tai kieli, joka pystyy käsittelemään tällaista asiaa, voi tehdä saman, mutta eri syntaksilla: $var=~s/a/b/g, gsub(/a/,"b",var), var.gsub(/a/,'b'), var.replace(/a/g,'b'), preg_replace("/a/","b",$var), regsub -all a b $var. Tämän lisäksi monet työkalut ja kielet voivat myös korvata tekstimerkkijonon. Joten kysymyksesi on jotenkin laaja.
  • Miksi? Mitä ongelmaa yrität ratkaista?
  • TV: n rajatuissa linux-järjestelmissä ei ole komentoa. Joten minun on käytettävä muuta komentoa tai komentosarjaa sed ’ s / a / b / g ’ -tekstin sijaan.

Vastaus

Kyllä, tähän on useita tapoja. Voit käyttää näitä toimintoja myös awk, perl tai bash avulla. Yleensä vaikka sed on todennäköisesti kaikkein sopivin työkalu tämän tyyppisten tehtävien suorittamiseen.

Esimerkkejä

Sano, että minulla on nämä näytetiedot, tiedostossa data.txt:

foo bar 12,300.50 foo bar 2,300.50 abc xyz 1,22,300.50 

awk

$ awk "{gsub("foo", "foofoofoo", $0); print}" data.txt foofoofoo bar 12,300.50 foofoofoo bar 2,300.50 abc xyz 1,22,300.50 

Perl

$ perl -pe "s/foo/foofoofoo/g" data.txt foofoofoo bar 12,300.50 foofoofoo bar 2,300.50 abc xyz 1,22,300.50 

Sisäinen muokkaus

Yllä esimerkit voivat myös muokata tiedostoja suoraan. Perlin esimerkki on triviaali. Lisää vain -i -kytkin.

$ perl -pie "s/foo/foofoofoo/g" data.txt 

awk ”on vähän vähemmän suora, mutta yhtä tehokas:

$ { rm data.txt && awk "{gsub("foo", "foofoofoo", $0); print}" > data.txt; } < data.txt 

Tämä menetelmä luo alikuoren aaltosulkeilla” {…} ”missä tiedosto on ohjataan siihen tällä tavalla:

$ { ... } < data.txt 

Kun tiedosto on uudelleenohjattu alikuoreen, se ”poistetaan ja sitten awk ajetaan tiedostojen sisältöön, joka on luettu alikuoriin STDIN. Tämän sisällön käsittelee sitten awk ja kirjoittaa takaisin samaan tiedostonimeen. jonka olemme juuri poistaneet korvaamalla sen tehokkaasti.

Kommentit

  • Kiitos vastauksestasi ja yritän sitä seuraavana työpäivänä. Mutta en ole varma se toimii, koska jotkut komennot eivät ehkä ole olemassa rajattuissa Linux-järjestelmissä, kuten ’ sed ’. Joten haluan silti käyttää komento ’ etsi ’, ’ grep ’ ja niin edelleen sen ratkaisemiseksi.
  • @binghenzq – Olen ’ lisännyt esimerkkejä, jotka muokkaavat tiedostoa.
  • -1 Äänestän harvoin, mutta tässä tapauksessa kysymys näytti olevan yksinkertaisempi menetelmä kuin muu monimutkaisempi ja todennäköisesti myös riippuvainen menetelmä. Jos kysymys koski vain vaihtoehtoja täydelle * nix-koneen asennukselle, annan todennäköisesti +1 tälle muuten hyvälle vastaukselle.
  • @MichaelDurrant – Lisäsin juuri ne monimutkaiset sisäiset muokkaukset b / c, jota OP pyysi . Myös OP asetti vaatimuksen EI käyttää sed ei I. Sed on sopiva työkalu tämänkaltaisten korvausten tekemiseen, ja hän ’ ilmeisesti pyytämällä ymmärtämään paremmin näiden työkalujen rooleja, joten näkeminen jollekin näistä asioista, vaikka he ovatkin pahoja, ovat erittäin opettavia osoittamaan heille miksi. Liian monta kertaa tiedossa oleva ppl sanoo yksinkertaisesti ” älä ’ t tee sitä ” selittämättä miksi, niin olen. Mutta kiitos ainakin kommentin jättämisestä miksi sinä DV.
  • Toki ajattelin, että se oli hieno vastaus kaikilta osin. kyllä, vihaan -1 ilman selitystä.

Vastaus

Klassinen vaihtoehto yhden kirjaimen korvaamiselle on tr -komento, jonka pitäisi olla käytettävissä melkein missä tahansa järjestelmässä:

$ echo "foobar" | tr a b foobbr 

tr on parempi kuin sed tälle, koska sed (puhumattakaan perl tai awk) yhden kirjaimen korvauksille on kuin kelkkavasaran käyttäminen perhon tappamiseen.

grep ei ole suunniteltu tätä varten, se ei muokkaa syöttöään, vaan vain etsii sen kautta.

Vaihtoehtoisesti voit käyttää joidenkin kuorien korvausominaisuuksia . Tässä käyttämällä ksh, zsh tai bash syntaksia:

$ foo="foobar" $ echo "${foo//a/b}" foobbr 

Voisimme antaa sinulle tarkempia vastauksia, jos selität tarkalleen minkä ongelman yrität ratkaista.

Kommentit

  • Onko mahdollista jättää tapaus huomiotta ${foo//a/b}?
  • @ AlikElzin-kilaka I ’ pelkään ei. ’ Sinun on käytettävä jotain kehittyneempää, esimerkiksi: echo "$foo" | sed 's/a/b/i tai annettava merkkiluokka: echo ${foo//[aA]/b}.

Vastaa

Voit käyttää POSIX-työkalua ex:

ex a.txt <<eof %s/Sunday/Monday/g xit eof 

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html

Kommentit

  • kiitos. vain lisätäksesi, -c-lippu on komennon suorittaminen muokkauksen alkaessa (koska ex on editori) ja -s-lippu on joko komentomooditila, joka estää palautetta tai kuten jotkut haluavat sanoa slient-mode. lähetä lisätietoja: ex-vi.sourceforge.net/ex.html

Vastaa

Jos työskentelet tiedoston, ei suoratoiston, kanssa, voit käyttää tavallista tekstieditoria, ed:

printf "%s\n" ",s/a/b/g" w q | ed file.txt 

Tämän pitäisi olla käytettävissä missä tahansa * nixissä. Pilku kohdassa ",s/a/b/g" kertoo ed työskennellä jokaisella rivillä (voit käyttää myös %, joka on tutumpi, jos olet tottunut vimiin), ja loput se on tavallinen haku ja korvaaminen. w käskee sen kirjoittamaan (tallentamaan) tiedoston, q käskee sen poistumaan.

Huomaa, että toisin kuin sed ”s -i -vaihtoehto (ja vastaavat vaihtoehdot muissa työkaluissa), tämä itse asiassa muokkaa tiedostoa paikallaan eikä huijaa väliaikaisilla tiedostoilla.

En aio ”Luulen, että tämä ei ole mahdollista saada toimimaan virtojen kanssa, mutta sitten en tiedä paljoakaan ed: stä, enkä olisi yllättynyt, jos sillä todella on tämä kyky (unix-filosofia on mikä se on).

Vastaa

Esivanhemman käyttäminen -komento (jossa -s tarkoittaa hiljaa (hiljainen) ja pilkku ennen komentojen suorittamista kaikilla riveillä):

Vain tulostus päällä STDOUT :

ed -s file <<! ,s/a/b/g ,p q ! 

korvaa paikan päällä:

ed -s file <<! ,s/a/b/g w q ! 

Vastaa

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