
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 'BBB
in zu ändern 'BBB'
, und ich dachte, ich würde sed
und [
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 AAA
muss 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 sed
nicht richtig funktionieren und um dies zu überprüfen, habe ich sed
die 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 sed
linke und eckige Klammern unterschiedlich behandelt werden. Ich konnte ohne Escapezeichen auskommen [
, while sed
funktioniert 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 sed
oder 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 sed
und 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']