2017-06-20 6 views
3

Leute,einfache und doppelte Anführungszeichen mit vorangestelltem Backslash

Ich habe versucht, einen sed-Befehl zu erhalten, die \'-' und \\" zu \" in einer Datei ersetzen wird. Ich habe versucht, die unten mit sed aber ich bin nicht in der Lage herauszufinden, wie einzelne und doppelte Anführungszeichen zu trennen.

$ cat temp 
\' 
\\" 

$ cat temp | sed 's#\\\\"#\\"#' | sed 's#\\'#'#' 
' 
" 

gewünschte Ausgabe ist

' 
\" 

Kann jemand darauf hinweisen, was ich falsch mache.

Hinweis: Ich möchte

in der Datei
+0

Sie nicht 'verwenden können‘ 'in einfache Anführungszeichen so .. verwenden' \ x27' statt .. 'sed 's # \\\ x27 # \ x27 #'' – Sundeep

+0

Sie benötigen alle '' \\ zu auf "\" reduziert werden, oder nur solche, die von Anführungszeichen gefolgt werden? –

Antwort

2

awk Lösung diese Änderung auf alle Vorkommen anzuwenden:

awk '{ gsub(/\\\047/,"\047",$0); gsub(/\\\\\042/,"\\\042",$0) }1' temp 

Der Ausgang:

' 
\" 
+0

Sieht aus wie diese Arbeit. Lass es mich testen und dann werde ich das als Antwort akzeptieren! . Danke – Garfield

+0

In diesem Fall funktioniert auch sub. –

0

mit GNU sed 4.2.2 Getestet , nicht sicher über die Portabilität
Ich habe modifizierte Eingangsabtastwert bessere Arbeits des Befehls zu zeigen:

$ cat temp 
\' and \\' and \\\' 
\" and \\" and \\\" 

$ sed -E 's/\\([\x27"])/\1/g' temp 
' and \' and \\' 
" and \" and \\" 
  • -E Verwendung ERE, einige sed Versionen verwenden -r
  • \\([\x27"]) wird durch ' oder " und die Anführungszeichen allein \ gefolgt entsprechen ist erfasst
  • \1 die erfasste Gruppe wird als Ersatz verwendet
  • g modi fier alle solche Vorkommnisse in Zeile

ändern nur \\" und kein Auftreten von \"

$ sed -E 's/\\\x27/\x27/g; s/\\\\"/\\"/g;' temp 
' and \' and \\' 
\" and \" and \\" 
0

ersetzen Diese für Sie arbeiten könnte (GNU sed):

sed 's/\\\(\\['\''"]\)/\1/g' file 

oder:

sed -r 's/\\(\\['\'"])/\1/g' file 

Das Problem ist, dass das einfache Anführungszeichen verwendet wird, um den Ausdruck sed zu zitieren, und daher in der Shell notiert werden muss, daher \'. Durch die Verwendung einer Zeichenklasse für das einfache Anführungszeichen oder das doppelte Anführungszeichen kann die Substitution eine Rückreferenz verwenden und somit die rechte Seite der Ersetzung vereinfachen.

+0

Die würden '\ '' nicht in '' 'konvertieren, wie das OP es wünscht. –

-2

Eine der Schwierigkeiten, die Sie haben, besteht darin, dass Sie Ihren Ausdruck als Befehlszeilenargument für sed schreiben und ihn daher für Ihre Shell angeben müssen.Es ist viel einfacher, wenn Sie Ihr sed Programm in einer Datei schreiben:

#!/bin/sed -f 

s/\\'/'/g 
s/\\\\"/\\"/g 

Sie müssen jeden \ verdoppeln sie den s Befehl zu zitieren, aber es gibt keine zusätzliche Angabe, dass der Schal erfordern würde.

Demonstration:

$ cat 44649501.input 

\' 
\\" 

$ ./44649501.sed <44649501.input 

' 
\" 
1

Mit jedem auf jedem Feld UNIX sed:

$ sed 's/\\'\''/'\''/g; s/\\\\"/\\"/g' file 
' 
\" 

mit GNU oder OSX für EREs mit -E aktiviert sed:

$ sed -E 's/\\('\''|\\")/\1/g' file 
' 
\" 
+1

Große Lösung Ed wie immer. Ich möchte Ihnen eine Frage stellen, wie man wie Ed werden einen Tag sein kann ich Experte wie Sie :) – RavinderSingh13

+1

Dank Ravinder werden könnte, alles ist :-) 38 Jahre Programmiererfahrung nimmt. –

Verwandte Themen