[megoldva] kétlépéses csere perlben

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

Hozzászólások

sed -i 's/AAA\(.\{5\}\)/AAAvalami_mas/g' test.txt

Ez miért nem jó?

Arra gondolsz, hogy s/AAA(.....)/AAAakarmi/; s/akarmi/barmimas/; ?

--
|8]


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

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

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.