2017-08-02 1 views
0

Ich habe eine Textdatei namens 123.txt Im 123.txt enthält esPerl nicht in der Lage in Variable zu lesen Wörter zu ersetzen [KSH]

ist in Ordnung%: Das
nicht in Ordnung% gut ist : das

Meine Aufgabe das Wort von schlecht "ist in Ordnung%" % zu okay, kann

zu ersetzen istMein aktueller Code (Problem)

$temp_var="is okay \%" 
perl -pi -e 's/$temp_var/okay can \%/g' *123.txt 

Der Grund, einen umgekehrten Schrägstrich auf% setzt Sonderzeichen zu behandeln.

Ich habe versucht mit sed -i für meine vorherige Codierung, aber es hat nicht funktioniert als -I ist nicht Teil der klassischen Schnittstelle, ich habe versucht, Platzierung 's/ist okay \%/okay kann \%/g ' anstelle von $ temp_var und es kann arbeiten.

Ich bin nicht sicher, ob es die Art, wie ich meine Variable gegossen ist oder temp_var $ ist nicht in der Lage

Dank in PERL zu lesen!

+0

'%' ist kein Sonderzeichen in Regex-Literalen oder in Regex-Mustern. – ikegami

Antwort

3

In s/$temp_var/okay can \%/g, bezieht sich auf eine $temp_var Perl Variable. Nichts außer dem ksh Prozess weiß über seine Variablen. Sie müssen den Wert für Perl angeben.


Fest programmiert:

perl -i -pe's/is okay %/okay can %/g' *123.txt 

Via Argument:

text='is okay %' 
perl -i -pe' 
    BEGIN { $text = shift(@ARGV); } 
    s/\Q$text/okay can %/g; 
' "$text" *123.txt 

über eine env var:

text='is okay %' 
TEXT="$text" perl -i -pe's/$ENV{TEXT}/okay can %/g' *123.txt 

über eine env var:

export TEXT='is okay %' 
perl -i -pe's/$ENV{TEXT}/okay can %/g' *123.txt 

Hinweis: "\Q$text\E" erstellt einen regulären Ausdruck, der den Wert von $text entspricht. (Eine nachlaufende \E kann weggelassen werden.)

+0

Hallo, ich weiß, BEGIN {$ text = shift (@ARGV); }Was bedeutet das? – Jolin

+0

Zur Kompilierzeit (d.h.vor der durch '-p' erzeugten Schleife, greifen Sie das erste Argument und entfernen Sie es. – ikegami

+0

Wie wäre es mit zusätzlichen ** $ text2 ** examepl s/\ Q $ Text $ test2/okay kann%/g; '"$ text $ text2" * 123.txt ... Wird dies verletzt? – Jolin

0

Ihr Ersatz funktioniert bei mir, das einzige, was ich anders gemacht habe, ist, dass ich auch die Variable $ temp_var im Oneliner selbst deklariert habe.

$ cat so45451136.txt 
is okay % : That's good 
not okay % : That's bad 

$ perl -pe '$temp_var="is okay \%";s/$temp_var/okay can \%/g;' so45451136.txt 
okay can % : That's good 
not okay % : That's bad 
+0

Das OP möchte wahrscheinlich den Wert von '$ temp_var' beibehalten, anstatt den Wert hardcoded zu haben. Und wenn es ihnen recht ist, wenn der Wert fest codiert ist, warum ist das dann so kompliziert? – ikegami

+0

Hallo @ikegami Weil ich diese multi-times verwenden muss, wird Variable daher eine bessere Wahl sein. – Jolin

+0

@ permanent409 jede Alternative außer in oneliner als der Wert als tatsächlich deklariert, ist es ein Funktionsparameter. – Jolin

Verwandte Themen