Hogyan lehet megtalálni és kicserélni a karakterláncot a Sed parancs használata nélkül?

Mint mindannyian tudjuk, a sed nagyon hatékony a karakterlánc megkereséséhez és cseréjéhez, például az “a” megtalálásához és cserélje le “b” -re: sed "s/a/b/g".

Lehetséges-e ezt más parancsokkal vagy shell parancsfájlokkal megtenni a sed?

Ez egy olyan TV számára levágott linuxos rendszerekre vonatkozik, amelyek nem rendelkeznek a sed paranccsal. Tehát más parancsokat vagy szkripteket kell használnom a sed "s/a/b/g". –

Megjegyzések

  • helyett. csak a reguláris kifejezésen alapuló helyettesítés. Bármely eszköz vagy nyelv, amely képes kezelni az ilyesmit, képes lesz ugyanarra, de különféle szintaxissal: $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. Emellett számos eszköz és nyelv képes egyszerű szöveges karakterlánc-cserére is. Tehát a kérdése valahogy tág.
  • Miért? Milyen problémát próbál megoldani?
  • A tévékészülék számára egy levágott linuxos rendszer nem rendelkezik parancssal. Tehát más parancsot vagy szkriptet kell használnom a sed ‘ s / a / b / g ‘ helyett.

Válasz

Igen, ennek különféle módjai vannak. Használhatja a awk, perl vagy a bash elemeket ezeknek a tevékenységeknek a végrehajtására is. Általában bár a sed valószínűleg a leginkább megfelelő eszköz az ilyen típusú feladatok elvégzéséhez.

Példák

Mondjuk, hogy rendelkezem ilyen mintaadatokkal, fájlban 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 

Beépített szerkesztés

A fentiek a példák közvetlenül módosíthatják a fájlokat is. A Perl-példa triviális. Egyszerűen adja hozzá a -i kapcsolót.

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

awk “kicsit kevésbé közvetlen, de ugyanolyan hatékony:

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

Ez a módszer létrehoz egy alhéjat a zárójelekkel” {…} “, ahol a fájl található ezen keresztül irányította át:

$ { ... } < data.txt 

Miután a fájlt átirányították az alhéjba, “törli, majd awk fájlt futtatják az STDIN alhéjakba beolvasott fájl tartalmával. Ezt a tartalmat ezután a awk feldolgozza, és ugyanazon fájlnévre írja vissza hogy most töröltük, és hatékonyan helyettesítettük.

Megjegyzések

  • Köszönöm a választ, és megpróbálom a következő munkanapon. De nem vagyok biztos benne, hogy azért működik, mert bizonyos parancsok nem létezhetnek a TV kivágott linuxos rendszereiben, például ‘ sed ‘. Tehát továbbra is használni szeretném parancs ‘ find ‘, ‘ grep ‘ és így tovább annak megoldására.
  • @binghenzq – én ‘ olyan példákat adtam hozzá, amelyek szövegesen szerkesztik a fájlt.
  • -1 Ritkán visszavetem, de ebben az esetben a úgy tűnt, hogy a kérdés egyszerűbb módszer, nem pedig más, ugyanolyan összetett és valószínűleg szintén függő módszer. Ha a kérdés csak a teljes * nix gép telepítésének alternatíváiról szólt, akkor valószínűleg +1-et adnék ennek az egyébként jó válasznak.
  • @MichaelDurrant – csak hozzáadtam azokat a bonyolult soros szerkesztéseket b / c, amelyeket az OP kért tőlük . Szintén az OP előírta a NEM követelményét a sed és nem I. használatával. Sed a megfelelő eszköz az ilyen helyettesítések elvégzéséhez, és ő ‘ nyilvánvalóan arra kérnek, hogy jobban megértsék ezeknek az eszközöknek a szerepét, tehát ha valakinek ezeket a dolgokat mutatják, bár rosszak, rendkívül oktatóak, hogy megmutassák miért. Túl sokszor a know-ben szereplő ppl azt mondja, hogy ” ne ‘ t ne tegye ” anélkül, hogy elmagyaráznám miért, tehát én vagyok. De köszönöm, hogy legalább megjegyzést tettél arra, hogy miért DV.
  • Persze, azt gondoltam, hogy ez minden más szempontból remek válasz. igen, gyűlölöm a -1-et magyarázat nélkül.

Válasz

Az egybetűs helyettesítések klasszikus alternatívája a tr parancs, amely szinte minden rendszeren elérhetőnek kell lennie:

$ echo "foobar" | tr a b foobbr 

tr jobb, mint a sed, mert a sed (nemhogy perl vagy awk) az egybetűs helyettesítésekhez olyan, mintha egy szánkókalapácsot használnánk egy légy megölésére. A p> grep nem erre készült, nem módosítja a bemenetét, csak rajta keresztül keres.

Alternatív megoldásként használhatja egyes héjak helyettesítési képességeit . Itt a ksh, zsh vagy bash szintaxist használva:

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

Konkrétabb válaszokat adhatnánk, ha pontosan elmagyarázná, hogy milyen problémát próbál megoldani.

Megjegyzések

  • Van-e lehetőség az eset figyelmen kívül hagyására ${foo//a/b} esetén?
  • @ AlikElzin-kilaka I ‘ félek nem. ‘ Önnek valami kifinomultabbat kell használnia, például: echo "$foo" | sed 's/a/b/i, vagy karakterosztályt kell megadnia: echo ${foo//[aA]/b}.

Válasz

Használhatja a POSIX eszközt ex:

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

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

Megjegyzések

  • nagyon köszönöm. Csak hozzáadásként a -c flag a parancs végrehajtását jelenti, amikor a szerkesztés megkezdődik (mivel az ex egy szerkesztő), és a -s flag vagy szkript mód, amely letiltja a visszacsatolást, vagy ahogy egyesek szeretik mondani, hogy slient-mode. ref további információkért: ex-vi.sourceforge.net/ex.html

Válasz

Ha nem fájlfolyammal, hanem fájlokkal dolgozik, használhatja a szokásos szövegszerkesztőt, ed:

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

Ennek bármely * nixen elérhetőnek kell lennie. A ",s/a/b/g" mezőben található vessző ed, hogy minden vonalon dolgozzon (használhatja a % -et is, amely ismertebb lesz, ha már megszokta a vim-et), a többivel pedig ebből egy szokásos keresés és cserélés. A w azt mondja neki, hogy írja meg (menti) a fájlt, q azt mondja, hogy lépjen ki.

Ne feledje, hogy ellentétben sed “s -i opció (és hasonló lehetőségek más eszközökben), ez valójában helyben szerkeszti a fájlt, nem pedig ideiglenes fájlokkal csal.

Nem “Nem hiszem, hogy ezt streamekkel lehet működtetni, de akkor nem igazán tudok ed -ről, és nem lennék meglepve, ha valóban rendelkezik ezzel a képességgel (az unix filozófia az, ami van).

Válasz

Az ős használatával parancs (amelyben az -s csendes (néma), a vessző pedig a parancsok előtt azt jelenti, hogy minden sort végrehajtani):

Csak nyomtatás a STDOUT on:

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

helyben:

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük