Linke und rechte eckige Klammern werden von sed/bash unterschiedlich behandelt

Linke und rechte eckige Klammern werden von sed/bash unterschiedlich behandelt

Ich habe eine Datei mit folgendem Inhalt:

[root@server list]# cat filenames.txt
[AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB]
[root@qa4app01 list]#

Ich möchte dies als Liste zur Verwendung in meinem Python-Skript verwenden, daher versuche ich, AAA'in 'AAA'und 'BBBin zu ändern 'BBB', und ich dachte, ich würde sedund [durch ['und ]durch ersetzen '].

Zur Bestätigung habe ich Folgendes versucht:

[root@server list]# cat filenames.txt | sed "s/]/']/g"
[AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','MENSCOGH','TESTENT','DORASINE','LOKAWINK','BBB']
[root@server list]#

Es hat funktioniert und ich konnte das ]durch ein ersetzen ']. Also AAAmuss ich nur die rechten eckigen Klammern und das einfache Anführungszeichen im sed durch eine linke eckige Klammer ersetzen und habe Folgendes ausprobiert:

[root@server list]# cat filenames.txt | sed -e "s/]/']/g" -e "s/[/['/g"
sed: -e expression #2, char 8: unterminated `s' command
[root@server list]#

Okay. Ich dachte aus irgendeinem Grund, dass Anfügebefehle sednicht richtig funktionieren und um dies zu überprüfen, habe ich seddie linke eckige Klammer separat ausprobiert:

[root@server list]# cat filenames.txt | sed  "s/[/['/g"
sed: -e expression #1, char 8: unterminated `s' command
[root@server list]#

Seltsam. Es sieht so aus, als ob sedlinke und eckige Klammern unterschiedlich behandelt werden. Ich konnte ohne Escapezeichen auskommen [, while sedfunktioniert nicht ]ohne Escapezeichen. Ich habe schließlich das gewünschte Ergebnis erzielt, indem ich der linken eckigen Klammer Escapezeichen hinzugefügt habe, wie unten:

[root@server list]# cat filenames.txt | sed -e "s/]/']/g" -e "s/\[/\['/g" ['AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','MENSCOGH','TESTENT','DORASINE','LOKAWINK','BBB'] [root@server list]#

Ich bin gerade dabei, ein Python-Shell-Skript zu schreiben, das Dateien mit zahlreichen eckigen Klammern verarbeitet. Meine Frage ist, ob die rechte und linke eckige Klammer von sedoder unterschiedlich behandelt werden bash.

Die Sed-Version ist GNU Sed Version 4.2.1.

PS: Ich habe mich entschieden, Escape-Zeichen mit beiden Klammern zu verwenden, um auf Nummer sicher zu gehen, möchte aber absolut sicher sein, dass das Skript nicht kaputt geht, wenn ich das Escape-Zeichen (aus Gründen der Lesbarkeit) an Stellen nicht verwende, an denen ich nur mit der rechten eckigen Klammer arbeite.]

Antwort1

[führt einZeichenklasseund ]schließt es.

Wenn sed nur sieht ](also den Schließbefehl), ist alles in Ordnung. sed geht davon aus, dass dies kein spezieller Befehl ist.

Die Verwendung von only [(ohne schließendes ]) führt zu Verwirrung sedund muss daher maskiert werden.

Nebenbei bemerkt, es besteht keine Notwendigkeit für

  • g(globales) Flag (nur eine Ersetzung pro Zeile)
  • Flucht [als Ersatz.

Ich habe Ihre Änderung mit

sed -e "s/]/']/" -e "s/\[/['/" 

Antwort2

Archemar hat erklärt, warum dies fehlgeschlagen ist [. Hier ist eine andere Möglichkeit, diesen speziellen Ersatz vorzunehmen:

$ sed "s/^./['/;s/.$/']/" file
['AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB']

Oder mit „ &which“ als Bedeutung „was auch immer Sie gerade gefunden haben“:

$ sed "s/^./&'/;s/.$/'&/" file
['AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB']

verwandte Informationen