Ich habe ein Verzeichnis von HTML-Dateien, in dem ich alle Inhalte (und einschließlich) eines passenden Ausdrucks entfernen möchte. Ich habe dies versucht (XXXXXX ist der gesuchte String,
perl -pi -e "$a++if s/.*XXXXXX.*//si;$a||s/.*//s" *.html
Ich bekomme diesen Fehler (wenn ich Enter drücke, ändert sich mein Befehl, siehe erste Zeile):
perl -pi -e "$a=1 if *.htmla && s/.*XXXXXX.*//is; s/.*//s if *.htmla" *.html
Bareword found where operator expected at -e line 1, near "*.htmla"
(Missing operator before htmla?)
Bareword found where operator expected at -e line 1, near "*.htmla"
(Missing operator before htmla?)
syntax error at -e line 1, near "="
syntax error at -e line 1, near "*.htmla
"
Execution of -e aborted due to compilation errors.
Irgendwelche Hilfe auf Perl-Befehl zu verwenden?
Antworten:
1 für die Antwort № 1Versuchen Sie es mit
"
anstatt
"
Andernfalls wird Ihre Shell $ a erweitern.
perl -pi -e "$a++if s/.*XXXXXX.*//si;$a||s/.*//s" *.html
sollte den Trick machen.
0 für die Antwort № 2
Ganz mit "
Anstatt von "
.
Variablen werden interpoliert "
-quoted Material; Muscheln machen das und Perl auch.
In diesem Fall wird Ihre Shell ersetzt $a
mit seinem Wert, bevor das Ergebnis an Perl übergeben wird. Das Ergebnis ist eine illegale Perl-Syntax.
0 für die Antwort № 3
Wenn Sie alle Zeilen bis zu einer Zeile löschen möchten, die einem regulären Ausdruck entspricht.
Sie können sed einen Bereich zuweisen und von der ersten Zeile bis einschließlich der Übereinstimmung löschen
sed -i -e "1,/match/d" file.html
Wenn Sie den Inhalt aus jeder Zeile entfernen möchten, die einem regulären Ausdruck entspricht
sed -i -e "s/.*match//" file.html