2014-11-10 11 views
9

Ich möchte einige Namen in einer Datei mit sed ändern. Dies ist, wie die Datei wie folgt aussieht:sed exact exact match

#! /bin/bash 

SAMPLE="sample_name" 
FULLSAMPLE="full_sample_name" 

... 

Jetzt will ich sample_name & nicht full_sample_name ändern nur

sed ich mit dieser versucht

sed s/\<sample_name\>/sample_01/g ... 

Ich dachte \ <> könnte verwendet werden, finde eine exakte Übereinstimmung, aber wenn ich das benutze, wird nichts geändert.

Hinzufügen '' half, nur den sample_name zu ändern. Allerdings gibt es ein weiteres Problem ist jetzt: meine Situation etwas komplizierter war als oben erläutert, da mein sed Befehl in einer Schleife eingebettet ist:

while read SAMPLE 
do 
    name=$SAMPLE 
    sed -e 's/\<sample_name\>/$SAMPLE/g' /path/coverage.sh > path/new_coverage.sh 
done < $1 

So sollte sample_name mit dem Wert $ SAMPLE angebracht geändert werden. Wenn Sie den Befehl ausführen, wird sample_name jedoch in $ SAMPLE geändert und nicht in den Wert, der an $ SAMPLE angehängt ist.

+0

Welche System sind Sie auf und Was ist deine Sed-Version? – anubhava

+0

Was möchten Sie tun? Einige Beispiele bitte – nowox

+0

GNU sed Version 4.2.1 – user1987607

Antwort

10

I \< und \> Arbeit mit Gnu glauben sed, müssen Sie nur den sed Befehl zitieren:

sed -i.bak 's/\<sample_name\>/sample_01/g' file 
+0

das '' funktionierte, um nur sample_name zu ändern. Allerdings habe ich jetzt ein anderes Problem erstellt, siehe oben in meiner Frage. – user1987607

+2

Sie müssen doppelte Anführungszeichen anstelle von einfachen Anführungszeichen verwenden, um die Shell-Variablen im sed-Befehl zu verwenden: 'sed 's/\ /$ SAMPLE/g"/pfad/coverage.sh' – anubhava

+1

danke, das funktioniert einwandfrei – user1987607

2

In GNU sed, die folgenden Befehl funktioniert:

sed 's/\<sample_name\>/sample_01/' file 

Der einzige Unterschied ist, dass ich den Befehl in einfache Anführungszeichen eingeschlossen haben. Selbst wenn es nicht notwendig ist, einen sed Befehl zu zitieren, sehe ich sehr wenig Nachteil dabei (und es hilft, diese Art von Problemen zu vermeiden).

Ein anderer Weg zu erreichen, was Sie mehr portably wollen, ist durch die Zitate dem Muster und den Ersatz Zugabe:

sed 's/"sample_name"/"sample_01"/' script.sh 

Alternativ kann die Syntax Sie funktioniert auch in GNU awk vorgeschlagen haben:

awk '{sub(/\<sample_name\>/, "sample_01")}1' file 

Wenn Sie eine Variable in der Ersetzungszeichenfolge verwenden möchten, müssen Sie anstelle von einzelnen Anführungszeichen doppelte Anführungszeichen verwenden, z. B .:

sed "s/\<sample_name\>/$var/" file 

Variablen werden nicht in einfache Anführungszeichen expandiert. Daher erhalten Sie den Namen Ihrer Variablen und nicht ihren Inhalt.

1

@ user1987607

Sie diese auf folgende Weise tun:

sed s/"sampelname">/sample_01/g

wobei "sample_name" in Anführungszeichen "" mit dem genauen Zeichenfolgenwert übereinstimmt.

/g ist für globalen Ersatz.

Wenn "sample_name" auftritt wie diese ifsample_name und Sie ersetzen möchten, dass auch dann sollten Sie folgendes verwenden:

sed s/"sample_name "> /" sample_01"/g

Damit ersetzt es nur das gewünschte Wort. Zum Beispiel wird die obige Syntax das Wort "the" aus einer Textdatei ersetzen und nicht von Wörtern wie dieser.

Wenn Sie nur das erste Vorkommen ersetzen interessiert sind, dann würde dies funktionieren

sed s/"sample_name"/sample_01/

Hoffe, es hilft

Verwandte Themen