Egy olyan cserére vágyom, amely egy szövegfájlban két lépésben történik:
- először egy minta segítségével megadnám, hogy pl. a három A betű utáni öt karakter lenne a cserélendő: AAA(.....)
- utána pedig (az A betűktől függetlenül, bárhol előforduló módon) a fenti zárójeles kifejezést szeretném cserélni egy általam megadott karakterláncra.
Egy primitív és lassú módszerem már van (rákereséssel szkriptgyártás és annak lefuttatása), de úgy sejtem, ez egy-két jól formázott perl utasítással is megoldható.
- 1660 megtekintés
Hozzászólások
sed -i 's/AAA\(.\{5\}\)/AAAvalami_mas/g' test.txt
Ez miért nem jó?
- A hozzászóláshoz be kell jelentkezni
Azért, mert nem csak AAA utáni helyzetben szeretném kicserélni a karakterláncot, hanem bárhol.
- A hozzászóláshoz be kell jelentkezni
Arra gondolsz, hogy s/AAA(.....)/AAAakarmi/; s/akarmi/barmimas/; ?
--
|8]
- A hozzászóláshoz be kell jelentkezni
Végül is igen.
AAA(.....)-ból a zárójeles rész legyen az akármi, s ezután; s/akarmi/barmimas/g; - De ez azonos a tiéddel.
- A hozzászóláshoz be kell jelentkezni
Asszem, általánosságban ez a szándékod:
perl -e '$s="AAAezt, EZT nem, de ezt meg ezt igen\n"; $s=~s/AAA(ezt)/erre/; $s=~s/$1/amarra/g; print $s'
erre, EZT nem, de amarra meg amarra igen
- A hozzászóláshoz be kell jelentkezni
Ez tökéletes, köszönöm!
- A hozzászóláshoz be kell jelentkezni
sed 's/\(AAA(\)[^\)]*\()\)/\1_foo_\2/g'
Azaz az első csoport legyen AAA(
\(AAA(\)
azt kövesse nem záró zárójelből nulla vagy bármennyi
[^\)]*
a második csoport pedig legyen a záró zárójel
\()\)
Ezt cseréljük le az első csoport _foo_ második csoport stringre, globálisan.
A trükk, illetve amire figyelni kell, az a \ karakterek helyes adagolása :-)
Opsz, tehát az AAA(_ezt_) -ből az következik, hogy
1,$s/_ezt_/erre/g
Arra ez tényleg nem jó.
- A hozzászóláshoz be kell jelentkezni
Jó lett volna, ha van valami sample input-od, és sample outputod, az érthetőség megkönnyítése érdekében.
Ilyesmire gondolsz?
$txt_original="Arkarmit ithaaatokkk ide? aaaztamindenit. tokkkal-vonoval";
$txt_replaced=$txt_original;
# megkeressuk a szukseges mintat
$txt_replaced =~ s/aaa(\w{5})/aaa12345/g;
# Ami a $1-be kerul. Onnan atmentjuk $text_to_replace -be
$text_to_replace=$1;
$txt_replaced =~ s/$text_to_replace/12345/g;
print("Original: ${txt_original}\n");
print("Replaced: ${txt_replaced}\n");
Normális formázással a Pastebinen: http://pastebin.com/yWrLRFd6
Output:
Original: Arkarmit ithaaatokkk ide? aaaztamindenit. tokkkal-vonoval
Replaced: Arkarmit ithaaa12345 ide? aaa12345ndenit. tokkkal-vonoval
- A hozzászóláshoz be kell jelentkezni
A többi megoldást is hálásan köszönöm! Fontos volt.
- A hozzászóláshoz be kell jelentkezni
Most nézem, elszúrtam a kódot... Helyesen: http://pastebin.com/M1FeZrxB
# output:
# -------
#
# To replace: tokkk
# Original: Arkarmit ithaaatokkk ide? aaaztamindenit. tokkkal-vonoval
# Replaced: Arkarmit ithaaa12345 ide? aaaztamindenit. 12345al-vonoval
Így az első aaa utáni öt karakter a tokkk. Ezt fogja lecserélni. Az aaaztamindenit szóban nincs benne a tokkk, ezért ott nem. A tokkkal-vonoval-ban megint lecseréli.
- A hozzászóláshoz be kell jelentkezni