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
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ää
sedei 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/itai 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 ed -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 !
$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.