Tämä toimii, jos koodissa ei ole kysäriä:
Koodi: Valitse kaikki
$s =~ s/<\? # php:n alkumerkki
([^\?])* # koodi (ei sisällä ?)
\?> # loppumerkki
/<!-- php -->/gx;
– Samanlainen ongelma koskee kommenttien poistamista '<!--' ... '-->'.
Viesti Kirjoittaja jpek »
Koodi: Valitse kaikki
$s =~ s/<\? # php:n alkumerkki
([^\?])* # koodi (ei sisällä ?)
\?> # loppumerkki
/<!-- php -->/gx;
Viesti Kirjoittaja nobu178 »
Viesti Kirjoittaja morbusg »
Koodi: Valitse kaikki
echo '<?...???!!!...?>' | sed 's/<\?\(.*\)\?>/<!--\1-->/g'
Viesti Kirjoittaja Thoth »
# echo '<?yksi?> <?kaksi?>' | sed 's/<\?\(.*\)\?>/<!--\1-->/g'morbusg kirjoitti:en tiedä perlistä, mutta jos sed käy niin:/ = erotin, voi olla muukin merkki, esim piippu.Koodi: Valitse kaikki
echo '<?...???!!!...?>' | sed 's/<\?\(.*\)\?>/<!--\1-->/g'
s = substitute
\( ... \) = laita talteen
\1 = ulosta ensimmäinen tallennettu
g = globaali muutos
Viesti Kirjoittaja Thoth »
Jep, ja minulta puuttui tuo "globaali muutos", joka oli sed-versiossa.nobu178 kirjoitti:= perl -pe 's/<\?.*?\?>/<!-- php -->/;'Thoth kirjoitti:perl -pe 's/<\?(.*?)\?>/<!-- php -->/;'
Viesti Kirjoittaja nobu178 »
Just niin. Tämä on varmaan vakiokeino korvata merkkijono '<?...?>' merkkijonolla '<!-- php -->'. En ole kuitenkaan varma siitä, tarkoittiko jpek juuri tätä...Thoth kirjoitti:Jep, ja minulta puuttui tuo "globaali muutos", joka oli sed-versiossa.
Eli:
perl -pe 's/<\?.*?\?>/<!-- php -->/g;'
Viesti Kirjoittaja jpek »
Viesti Kirjoittaja nobu178 »
Vika on todennäköisesti optiossa (ja vähän muussakin). Kokeile seuraavaa:jpek kirjoitti:Tarvitaan tarkennettu esimerkki:
jpek$ cat a.php
<?php
print "<b> - Hei $nimi ?</b>";
?>
jpek$ perl -pe 's/<\?.*?\?>/<!-- php -->/sg;' < a.php
<?php
print "<b> - Hei $nimi ?</b>";
?>
jpek$
Ei siis toimi ... Minulle riittää, jos php-koodin sisällä sallitaan ?, -, <, > mutta ei "?>".
Tulos siis pitäsi olla "<!-- php -->".
Viesti Kirjoittaja Thoth »
Toinen vaihtoehto, joka toimii ilman optioita:nobu178 kirjoitti:Vika on todennäköisesti optiossa (ja vähän muussakin). Kokeile seuraavaa:jpek kirjoitti:Tarvitaan tarkennettu esimerkki:
jpek$ cat a.php
<?php
print "<b> - Hei $nimi ?</b>";
?>
jpek$ perl -pe 's/<\?.*?\?>/<!-- php -->/sg;' < a.php
<?php
print "<b> - Hei $nimi ?</b>";
?>
jpek$
Ei siis toimi ... Minulle riittää, jos php-koodin sisällä sallitaan ?, -, <, > mutta ei "?>".
Tulos siis pitäsi olla "<!-- php -->".
perl -0777e '$str=<>;$str=~s/<\?.*?\?>/<!-- php -->/sg;print $str;' < a.php
EDIT: Sun kannattaa miettiä, mitä saisit optiolla '-p' tai '-n' aikaan (voit katsoa komennolla 'perl -h'). Muuten sulle tulee ongelmia joka kerta, kun haluat korvata komentoriviltä monirivisiä koodeja toisilla.
Viesti Kirjoittaja nobu178 »
Pääasia, että ongelmasi ratkesi. Samaan tulokseen pääsemiseksi on muitakin vaihtoehtoja, kuten Thoth yllä esittää. Jos halutaan, alkeellisempia komentoja putkittamallakin voidaan saada samoja tuloksia (vaikkapa korvaamalla ensin rivin vaihdot jollain ja palauttamalla ne myöhemmin takaisin). On kuitenkin välillä terveellistä muistaa, ettei optio(yhdistelmä) -pe tai -ne ole mikään yleisavain, joka sopii kaikkiin tarkoituksiin.jpek kirjoitti:Kiitos, jo toimii (vaikken käyttänyt kuin puolet kikoistasi)
Palaa sivulle “Ohjelmointi, skriptit ja palvelimet”