sed braucht `\\\ n`, um eine neue Zeile anzufügen

975
Mohammed Noureldin

Ich versuche, eine neue Zeile sedanzufügen, sie funktioniert nur, wenn ich die neue Zeile wie folgt hinzufüge \\\n:

echo "sometextutf8_filesystemmmmm" | sed -r "/utf8_filesystem/a \\\n# Passive mode" 

die Ausgabe:

sometextutf8_filesystemmmmm  # Passive mode 

Ein oder zwei hintere Schrägstriche funktionieren nicht ! Mit ein \noder zwei \\nBackslashes bekomme ich nur diese Ausgabe:

sometextutf8_filesystemmmmm n# Passive mode 

ohne neue Zeile.

Es funktioniert zwar einwandfrei ohne drei umgekehrte Schrägstriche zu haben:

echo "sometextutf8_filesystemmmmm" | sed -r "s/utf8_filesystem/\n# Passive mode/" 

Ausgabe:

sometext # Passive modemmmm 

Könnte jemand dieses Verhalten erklären?

-1
@ anubhava: `sed (GNU sed) 4.2.2` Mohammed Noureldin vor 6 Jahren 0
Dann sollte auch `sed -r '/ utf8_filesystem / a \\ n # Passivmodus`` funktionieren. anubhava vor 6 Jahren 0
@anubhava, ja das habe ich schon probiert. Eigentlich möchte ich eine Erklärung. Warum brauche ich drei oder zwei hintere Schrägstriche? was versuche ich zu entkommen Mohammed Noureldin vor 6 Jahren 0
Wenn Sie Double Escaping vermeiden möchten, verwenden Sie: `sed -r 's / utf8_filesystem / & \ n \ n # Passivmodus /'` anubhava vor 6 Jahren 0
https://stackoverflow.com/questions/2369314/why-does-sed-require-3-backslashes-for-a-regular-backslash#2372693 xenoid vor 6 Jahren 1
@xenoid, sorry, ich habe versucht zu verstehen, aber es ist immer noch nicht klar, ob Sie das für meine Situation nutzen könnten. Warum brauche ich drei, nicht nur zwei Backslashes? Die beiden werden eins -> `\ n` -> Ich würde eine neue Zeile erwarten, aber das ist es nicht. Es muss "\\\ n" sein, um zu funktionieren. Warum ist das so? Falls Sie einfache Anführungszeichen verwenden, lesen Sie bitte meinen Kommentar in der Antwort von RedGrittyBrick. Mohammed Noureldin vor 6 Jahren 0
Ich denke, Sie brauchen drei Backslashes, weil Sie doppelte Anführungszeichen verwenden. Auf diese Weise sieht die Shell selbst die einfachen oder doppelten Backslashes und interpretiert sie. Bei einfachen Anführungszeichen benötigen Sie zwei Backslashes. Wenn Sie versuchen, das Skript in zwei Teile zu brechen, gibt sed die Warnung `sed -r -e '/ utf8_filesystem / a' -e 'aus. char 18: erwartet \ nach 'a', 'c' oder 'i'. Lesen Sie, was "info sed" über die Befehle "a", "c" und "i" sagt. Ich verstehe das Problem so, ich weiß nicht, ob es die richtige Antwort ist. Paulo vor 6 Jahren 0

2 Antworten auf die Frage

0
RedGrittyBrick

Ich kann dein Problem nicht mit Bash reproduzieren.

$ echo aaa | sed -r 's/aaa/AAA \n#Passive mode/' AAA #Passive mode  $ myprog=sed  $ echo aaa | $myprog -r "s/aaa/AAA \n#Passive mode/" AAA #Passive mode 

Ich vermute, es gibt mehr als das, was in der Frage steht.


Wahrscheinlich liegt es daran

1) Sie verfügen wahrscheinlich über einen komplizierten Satz von Skripts und / oder Aliasnamen und / oder Umgebungsvariablen, die dazu führen, dass Ihre Argumente mehrmals ausgewertet werden

2) Sie verwenden falsche Anführungszeichen. Wenn Sie "Params"die Shell verwenden, wird die Konvertierung \\in konvertiert \.

Sie können mit einfachen Anführungszeichen glücklicher sein: 'params'

vergleichen Sie

$ echo "s/aaa/AAA \\\n#BBB/" s/aaa/AAA \\n#BBB/  $ echo 's/aaa/AAA \\\n#BBB/' s/aaa/AAA \\\n#BBB/ 
Es sind nicht die falschen Anführungszeichen. In meiner realen Situation übergebe ich dem Befehl "$ some_thing" einen Parameter, daher brauche ich die Anführungszeichen. Ich verstehe immer noch nicht, warum ich `\\ n` brauche. Normalerweise, wenn ich eine neue Zeile hinzufügen möchte, verwende ich einfach` \ n`. Mohammed Noureldin vor 6 Jahren 0
Wenn ich Ihren Fall mit einfachen Anführungszeichen verwende: "\\ n", warum brauche ich zwei hintere Schrägstriche? warum nicht nur eine? Mohammed Noureldin vor 6 Jahren 0
-1
Amjad Abdullah

Sie müssen ein einzelnes Angebot verwenden. Wenn Sie doppelte Anführungszeichen verwenden, werden die Sonderzeichen nicht wörtlich genommen. Wenn Sie also einen Backslash verwenden, müssen Sie ihn mit einem anderen Backslash überspringen. Wenn Sie ein einzelnes Anführungszeichen verwenden, wird alles wörtlich genommen, damit Sie Sonderzeichen "Leerzeichen, Dollarzeichen usw." nicht überspringen.

Sie können über Google mehr über Unterschiede zwischen einfachen und doppelten Anführungszeichen in einer Linux-Bourne-Again-Shell erfahren.

Ist es nicht ein Muss, ich möchte Variablen an `sed` übergeben, also brauche ich doppelte Anführungszeichen. Mohammed Noureldin vor 6 Jahren 0
Entschuldigung, wenn ich etwas vermisse. Ich denke nicht, dass es von Bedeutung ist, wenn Sie ein einzelnes oder doppeltes Anführungszeichen mit sed verwenden, solange Sie Vorsichtsmaßnahmen treffen, um Fluchtzeichen entsprechend zu verwenden. Ich habe in einem anderen Thread gelesen (und in Ihrem Fall ist es offensichtlich), dass '\' und 'n' umgangen werden müssen, damit Ihr Befehl wie erwartet funktioniert. Sie können hier nachsehen: https://stackoverflow.com/questions/723157/how-to-insert-a-newline-in-front-of-a-pattern Amjad Abdullah vor 6 Jahren 0
Eigentlich ist es wichtig, Sie können dies hier lesen https://superuser.com/questions/1249828/why-does-echo-e-some-text-show-only-one-one-backslash?noredirect=1&lq=1 aber das Verhalten von drei Backslashes ist für mich immer noch komisch. Mohammed Noureldin vor 6 Jahren 0
Danke, dass Sie mich auf den nützlichen Thread hingewiesen haben. Es folgt, was ich gesagt habe, da es nicht wichtig sein sollte, die Anführungszeichen zu verwenden **, solange Sie Ihre Vorsichtsmaßnahmen treffen, um Escape-Zeichen entsprechend zu verwenden. ** Der Link Ihrer Frage entspricht genau Ihrem Anliegen. Ich weiß nicht, warum Sie immer noch Zweifel haben. Ich bezweifle jedoch, warum es zwei verschiedene Übersetzungen gibt, die von bash selbst und von echo stammen, während echo in eine Shell eingebaut ist. Ich nahm an, dass die bash-Übersetzung genau durch Echo behandelt werden sollte. Es scheint jedoch, dass meine Annahme nicht zutrifft, insbesondere widerspricht sie dem praktischen Verhalten. Amjad Abdullah vor 6 Jahren 0