Sed Befehl mit Apostroph

2
sed -e 's/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/'

Ich habe diese Fehlermeldung:

  sed: -e expression, char 20: unterminated `s' command

Wie kann ich den sed-Befehl korrigieren?

researcher
quelle

Antworten:

7
$ sed -e "s/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/"

oder

sed -e 's/cluster_name: '\''Test Cluster'\'\/cluster_name:' '\'Test' 'Cluster1\'/

Das mit allen einfachen Anführungszeichen war schwieriger zu erstellen, ohne dass dieses Programm helfen würde. Wenn Sie Hilfe benötigen, um den Befehl korrekt auszuführen, können Sie ein C-Programm verwenden

$ cat w.c
#include <stdio.h>

int main(int argc, char *argv[]) {
        int i = 0;
        while (argv[i]) {
                printf("argv[%d] = %s\n", i, argv[i]);
                i++;
        }
        return 0;
}

Ich teste von cygwin, aber jede * nix-Shell sollte gleich sein

Sie sehen, dass dies funktioniert

$ ./w sed -e "s/cluster_name: 'Test Cluster'/cluster_name: 'Test Clust
er1'/"
argv[0] = F:\blah\w.exe
argv[1] = sed
argv[2] = -e
argv[3] = s/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/


$

Wenn Sie es mit dem Verdächtigen versuchen

sed -e 's/cluster_name: \'Test Cluster\'/cluster_name: \'Test Cluster1\'/'

Sie können das Programm verwenden, um den Fehler darin zu finden

Seiner führt nicht einmal aus

$ ./w  sed -e 's/cluster_name: \'Test Cluster\'/cluster_name: \'Test C
luster1\'/'
>CTRL-C

Weil es ein einzelnes Zitat fehlt

$ ./w 'fgg
& gt;

unter anderen problemen.

Und wenn man sich den Verdächtigen ansieht, scheitert es schon am Anfang, es bricht auf den Raum

$ ./w  sed -e 's/cluster_name: \'Test Clu
argv[0] = f:\blah\w.exe
argv[1] = sed
argv[2] = -e
argv[3] = s/cluster_name: \Test
argv[4] = Clu

Dieser arbeitet

$ ./w  sed -e 's/cluster_name: '\''Test Cluster'\'\/cluster_name:' '\'
Test' 'Cluster1\'/
argv[0] = F:\blah\w.exe
argv[1] = sed
argv[2] = -e
argv[3] = s/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/

Wenn Sie es zusammenstellen, können Sie versuchen, ein Leerzeichen und ein Zeichen hinzuzufügen. Anschließend wird angezeigt, ob der Anführungsmodus aktiviert oder deaktiviert ist. Wenn es deaktiviert ist, wenn Sie ein einzelnes Anführungszeichen verwenden möchten, verwenden Sie \ 'Wenn es aktiviert ist, deaktivieren Sie es mit' dann machen Sie \ ' oder nicht.

barlop
quelle
1
@researcher Auch wenn Sie C. nicht kennen. Wenn Sie das C-Programm kompilieren und verstehen können, wie es zu verwenden ist, wird es Ihnen sehr helfen, wenn Sie häufig auf Probleme stoßen, die auf der Kommandozeile stehen. Alle diese Programme, wie zum Beispiel sed, sind C-Programme, und dieses kleine C-Programm zeigt Ihnen, wie sie die Parameter sehen würden
barlop
2

Sie müssten den einfachen Anführungszeichen in der Sedierung entgehen s Befehl:

sed -e 's/cluster_name: '\''Test Cluster'\''/cluster_name: '\''Test Cluster1'\''/'

Das Bearbeiten einzelner Anführungszeichen ist oft schwierig. Wo immer ein einzelnes Anführungszeichen in der Zeichenfolge vorhanden ist, ersetzen Sie es mit '\'' Ich werde versuchen zu erklären, wie das funktioniert - fühlen Sie sich frei, dies zu verbessern!

'\'' - Das erste Zitat endet sed Zeichenfolge und das folgende wird von der Shell analysiert. Der umgekehrte Schrägstrich stellt das folgende Zeichen als einfaches Zeichen dar (und nicht als Metazeichen). Das abschließende Zitat beendet dann den interpretierten Abschnitt für die Bash und das folgende wird von analysiert sed.

suspectus
quelle
unerwartetes EOF bei der Suche nach übereinstimmenden ""
researcher
Das Bearbeiten einzelner Anführungszeichen ist ein Schmerz! Ich habe die Antwort aktualisiert.
suspectus
Ihr versagt immer noch $ echo abc|sed -e 's/cluster_name: '\''Test Cluster'\''/cluster_name: \'Test Cluster1\'/' >CTRL-C Versuchen Sie es mit meinem
barlop
Ich habe das zusätzliche Meta-Zeug der Ersatzsaite verpasst. Jetzt bearbeitet
suspectus
@suspectus gut, du hättest es beim ersten Mal testen sollen, anstatt beim dritten Mal!
barlop