2013-02-14 20 views
6

Ich brauche einen Sed-Befehl wie dies im Rahmen eines Shell-SkriptVerwenden von sed mit Befehlszeilenargument?

sed 's/brad/pitt/g' laufen

soll ich brad als Befehlszeilenargument liefern und führen Sie einen Befehl wie dieses

sed s/$ 1/pitt/g

Während dieser Befehl funktioniert, was würde ich wissen möchten, ist, wie kann ich diesen Befehl tun, ohne die Anführungszeichen zu entfernen, da ich etwas Inhalt in der Ersatzzeichenfolge haben könnte, die die Anführungszeichen benötigt.

Ich bin nicht so sicher mit den Zitaten und deshalb möchte ich sehen, wie die Dinge mit ein wenig Feinabstimmung funktionieren?

Antwort

15

können Sie sed "s/$1/pitt/g" oder sed 's/'$1'/pitt/g'

oder, falls das Befehlszeilenargument ist kein einfaches Wort, sed 's/'"$1"'/pitt/g'.

+0

Könntest du bitte deinen zweiten Punkt ausarbeiten? Wie helfen doppelte Anführungszeichen, ich meine, für welche Art von Eingabe wird es notwendig sein? – Dude

+0

Eingabe wie 'mehr als ein Wort'. aber wenn es Sonderzeichen enthält (interpretiert von sed), wird es etwas komplizierter. –

+0

ja das ist, was mich beunruhigt :( – Dude

3

Es gibt zwei Möglichkeiten, wie Sie es tun:

1) verwenden doppelte Anführungszeichen

sed "s/$1/pitt/g" 

2) den Befehl als String konstruieren und führen Sie es mit eval

SEDCMD="s/$1/pitt/g" 
eval sed $SEDCMD 

Die Eval-Methode funktioniert und ist sehr flexibel, wird aber als gefährlich angesehen, da sie anfällig für Code-Injection ist. Wenn Sie Ihren Eingaben nicht trauen, verwenden Sie nicht # 2

UPDATE: Die Kommentare sind richtig, es gibt keinen Nutzen für die Verwendung von eval (ich benutzte Eval mit sed auf diese Weise die ganze Zeit, und ich ' Ich bin nicht sicher, warum ....) sed Saiten für die spätere Verwendung zu erstellen, ist jedoch leistungsfähig: so werde ich eine neue 3) und lassen Sie 2 für die Leute zu spotten

3) Konstruieren Sie den Befehl als Zeichenfolge und dann renne 1 oder mehr davon

FOO='s/\(.*\)bar/\1baz/' 
BAR="s/$1/pitt/g" 
sed -e $BAR -e $FOO <infile >outfile 
+2

'eval' ist eine schreckliche Idee mit * Null * Vorteile. –

+0

Verwenden Sie nicht # 1, auch wenn Sie nicht Ihre Eingaben vertrauen.Es ist auch zugänglich, Code-Injektion. –

+0

@ that anderer Typ: Bitte zeigen Sie eine Code-Injektion Beispiel –