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ää
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 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.