[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: ^M und <? tags in PHP korrigieren


On Thu, Sep 15, 2005 at 09:11:22PM +0200, Fabian Koch wrote:

> Da kannst du ne Menge scripts ergoogeln mit 'crlf to lf script' oder sowas.

tr -d '\r' loescht alle ^M alias \r

Beispiel:
<file.php > tmp0815.php tr -d '\r'  && mv tmp0815.php file.php 


> Das <? mit <?PHP ersetzen (muss das ueberhaupt?) wuerde ich mit sed machen.
> 
> zB 'sed s/<?/<?PHP'

Boese!

aus <?PHP wird damit ein <?PHPPHP und spaeter ein <?PHPPHPPHP... und
irgendwann ... 

 
> also ungefaehr:
> 
> #!/bin/sh
> 
> for i in *;
> 	do foo=$(cat $i | sed s/<?/<?PHP);
> 	cat foo > $i;
> 	done;

Aeh, was soll das tun?
BTW: Nutzlose Benutzung von Katzen (google: "useless use of cat award")

Also vorausgesetzt, das regexp fuer sed funktioniert wie gewuenscht, dann
ggf sowas:

find /var/www -name "*.ht*" -o -name "*.php" | 
sed -e "s,^,',; s,$,',;" | xargs clear_php.sh 


(BTW: der sed-aufruf sorgt dafuer, dass alle Dateinamen in '' geschrieben
werden, damit xargs nicht ungluecklich wird, wenn eine Datei ein
Leerzeichen ethaelt. Man koennte es auch so machen: 
find ... -print0 | xargs -0 command 
Das funktioniert aber nicht auf allen Unices.  )

(BTW2: find ... -exec command {} \;" geht zwar, ist aber boese, zB weil
command fuer jede einzelne Datei ausgefuehrt wird. xargs hingegen buendelt
die Zeilen aus stdin und erzeugt dann wenige aufrufe mit vielen
Parametern also zB

file1
file2
...
file1000
file1001
...
file2000
...

wird zu:

command file1 file2 file3 file4 ... file1000
command file1001 file1002.... file 2000
...


)
 
Und clear_php.sh dann sinngemaess sowas:

http://rabe.uugrn.org/scripts/clear_php.sh

#! /bin/sh
# -----------------------------------------------
# 2005-09-15 Raphael Becker <rabe@xxxxxxxxx>
#
# PHP-Code saeubern
#

if [ $# -gt 0 ]; then
  # es gibt mehr als 0 Parameter

  # Temporaere Dateien
  PID=$$  
  TMPDIR="/tmp/$(basename $0).$PID/"
  mkdir "$TMPDIR" ||
    { echo "$0: Fehler: Kann kein temporaeres Verzeichnis $TMPDIR anlegen" >&2 ; exit ; }

  while [ -n "$1" ]; do
    # Alle Dateien (file1 file2 ... file1000 ...) aus der Parameterliste durchlaufen (siehe shift!)
    if [ -f "$1" ]; then
      # $1 ist eine Datei
      if [ -w "$1" ]; then
      # Schreibrechte auf $1 vorhanden
      TMPFILE="$TMPDIR/$(basename $1)"   
      # zB xyz/foo.php --> /tmp/clear_php.sh.47110815/foo.php
      if touch "$TMPFILE"; then
        # Koennen die tmp-Datei erzeugen
        if { tr -d '\r' < "$1" | sed -e 's,<? ,<?PHP ,g' > "$TMPFILE"; }; then
          # Erfolgreich in tempdatei konvertiert
          if mv "$TMPFILE" "$1"; then
            # success!!
            echo "$1 konvertiert"
          else
            # Das sollte theoretisch nicht vorkommen, da vorher alles
            # geprueft wurde (Schreibrechte)
            echo "$0: Fehler: Datei $1 konnte nach dem Konvertieren nicht zurueckgeschrieben werden" >&2
          fi
        else
          # irgendwas im tr|sed filter ist schiefgelaufen
          echo "$0: Fehler beim Konvertieren von $1" >&2
        fi
      else
        # Das sollte ansich immer funktionieren
        echo "$0: Fehler: Kann keine temporaere Datei erzeugen: $TMPFILE" >&2
      fi
    else
      # Schreibrechte der Quelldatei nicht vorhanden, keine Kovertierung
      # erzwingen
      echo "$0: Fehler: $1 ist nicht schreibbar" >&2
    fi
    else
      # zB Verzeichnisse, Sockets, Devices, ... 
      echo "$0: Fehler: keine Datei: $1" >&2
    fi

    # Parameterliste shiften, $2->$1, $3->$2 ... $n->$n-1, $n=""
    shift
  done

  # /tmp Aufraeumen.
  # Gefaehrlich, FIXME
  rm -Rf "$TMPDIR"

else
  echo "Aufruf: $0 file1 [file2 [fileN [...]]]" >&2
  exit 1
fi

# -----------------------------------------------

Ziemlich viel Script um ein einfaches tr | sed herum. Aber im Zweifel
lohnt es sich, diesen Aufwand zu treiben. recode arbeitet uebrigens nach
einer recht aehnlichen Struktur.

> Das sollte tun. Da kannste dann noch das mit dem CRLF mit reinwerfen

Ich verwende dafuer lieber "tr -d '\r'".

Es geht auch, wenn man sed -e 's,^M,,g' sagt, aber vielen ist beim
Abtippen nicht klar, dass man ein literales ^M an dieser Stelle eingeben
muss (in vi mit Strg+V, Strg+M), d.h. ein copypaste des scripts oben
wuerde nicht funktionieren.

Es gibt noch ein paar kleinere Schwachstellen, die dieses Script leider
fuer eine Anmeldung zum Nobelpreis verhindern. Wer sie findet, darf sie
behalten oder hier nennen. Es gibt einige.

Obiges Script kann natuerlich fuer nahezu beliebige Konvertierungsaufgaben
mit temporaerer Datei verwendet werden, es ist letztlich nur ein wrapper
um tr|sed herum in diesem Fall. Theoretisch kann man damit auch Grafiken
konvertieren oder andere Aufgaben erledigen, bei denen eine angebene
Datei (oder viele Dateien!) modifiziert werden soll.

MfG
-- 
Raphael Becker                                    http://rabe.uugrn.org/
                      http://schnitzelmitkartoffelsalat.und.rahmspin.at/
.........|.........|.........|.........|.........|.........|.........|..