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
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 ed 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 !
$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.