Ich habe einen sed-Ersatzbefehl, der sowohl mit BSD sed
als auch mit GNU kompatibel sein soll sed
. Erweiterte reguläre Ausdrücke sind kein Problem, da ich sie in diesem Fall nicht benötige. Mein Hauptproblem ist der Unterschied in der Art und Weise, wie die beiden sed
Zeichen-Escape-Sequenzen in den Ersetzungszeichenfolgen interpretieren . Meine Ersetzungszeichenfolge enthält Tabulatoren und Zeilenumbrüche, und ich möchte, dass sie zur Vereinfachung der Wartung in den Befehlszeichenfolgen angezeigt werden. BSD sed
interpretiert die Escape-Sequenzen jedoch nicht und GNU sed
tut dies . Was ist der geeignete Weg, sed
um diese Escape-Sequenzen auf BSD zu interpretieren? Die folgenden zwei Ausschnitte stehen für mein Problem:
GNU sed
echo ABC | sed 's/B/\n\tB\n'
yeilds
A
B
C
BSD sed
echo ABC | sed 's/B\n\tB\n'
Ausbeuten
AntBnC
Offensichtlich \n
und \t
sind nicht als Escape - Sequenzen von BSD interpretiertsed
Nun zu meiner Frage. Laut der BSD- sed
Manpage:
Um ein Newline-Zeichen in der Ersetzungszeichenfolge anzugeben, müssen Sie diesem einen Backslash voranstellen.
Bedeutet dies, dass ich einem wörtlichen Zeilenumbruch einen Backslash voranstellen muss? Wie kann man anweisen sed
, Escape-Sequenzen wie \n
im Ersetzungstext zu interpretieren ?
sed
. Am Ende wird es wahrscheinlich Sinn machen, awk zu verwenden. Was halten Sie von der Interpretation der von mir zitierten BSD sed-Manpage?Antworten:
Wenn Sie portable Skripte schreiben müssen, sollten Sie sich an die Funktionen des POSIX-Standards halten (auch bekannt als Single Unix oder Open Group Base Specification). Die Ausgabe 7 (auch bekannt als POSIX-1.2008) ist die neueste, aber viele Systeme haben sie noch nicht vollständig übernommen. Ausgabe 6, auch bekannt als POSIX-1.2001, wird im Großen und Ganzen von allen modernen Unices zur Verfügung gestellt.
In sed , die Bedeutung von Escape - Sequenzen wie
\t
und\n
ist nicht tragbar, mit der Ausnahme , dass in einem regulären Ausdruck ,\n
für eine neue Zeile steht. Ist im Ersetzungstext für einens
Befehl\n
nicht portierbar, aber Sie können die Sequenz Backslash-Newline verwenden, um für eine Newline zu stehen.Eine tragbare Methode zum Generieren eines Tabulatorzeichens (oder eines anderen in Oktal ausgedrückten Zeichens) ist mit
tr
. Speichern Sie das Zeichen in einer Shell-Variablen und ersetzen Sie diese Variable im sed-Snippet.Beachten Sie erneut, dass Zeilenumbrüche in regulären Ausdrücken und in
s
Ersetzungstexten unterschiedlich ausgedrückt werden müssen .Vielleicht möchten Sie stattdessen awk verwenden. Es erlaubt Backslash-Escapes, einschließlich Oktal-Escapes
\ooo
, in jedem String-Literal.quelle
Sie können die Bash-
$'...'
Anführungszeichen verwenden, um die Escape- Zeichen zu interpretieren, bevor Sie den String an übergebensed
.Von der Bash-Manpage:
quelle
Dies wurde auf Stack Overflow beantwortet:
/programming/1421478/how-do-i-use-a-new-line-replacement-in-a-bsd-sed
Es ist ziemlich genau das, was jw013 gesagt hat.
Um einen wörtlichen Tabulator einzufügen, geben Sie ctrl+ ein VTab.
quelle