5 Stimmen

Eine Zeichenkette entschlüsseln

Ich schreibe ein Shell-Skript und möchte eine Zeichenkette escapen. Gibt es eine Möglichkeit, dies zu konvertieren:

I'm happy.
You're sad.

a

I\'m happy.\nYou\'re sad.

Ich bin mir ziemlich sicher, dass es sich um eine Kombination aus sed / awk das dies tut....

Danke

1voto

Sie können dafür die einfache Bash verwenden (siehe http://tldp.org/LDP/abs/html/string-manipulation.html ).

Etwa so:

#!/bin/bash
X="I'm happy.
You're sad."
echo "========== BEFORE =========="
echo "${X}"
echo "========== AFTER ==========="
X="${X//\'/\\\'}"
X="${X//$'\n'/\\n}"
echo "${X}"
echo "============================"

Erzeugt eine Ausgabe:

========== BEFORE ==========
I'm happy. You're sad.
========== AFTER ===========
I\'m happy.\nYou\'re sad.
============================

0voto

Chaitan Punkte 256

Versuchen Sie

sed 's/\\ /\\n/g' | sed 's/\\'/\\\'/g'

Ich habe wahrscheinlich ein paar Fehler gemacht. \ hier. Am besten, Sie probieren es selbst aus.

0voto

Andy White Punkte 83877

Dies funktioniert beim Ersetzen der ' avec \' .

echo "I'm happy. You're sad" | sed "s/'/\\\'/g"

Sind Sie sicher, dass Sie das Leerzeichen zwischen "happy." und "You're" durch ein Leerzeichen ersetzen wollen? \n ? \n ist ein Zeilenumbruch, aber Ihre Originalzeile scheint keinen Zeilenumbruch zu enthalten.

0voto

Jonathan Leffler Punkte 694013

Ich glaube, das ist genau das, was Sie wollen. Die Abfolge der Operationen in der sed Befehl ist ziemlich kritisch. Beachten Sie, dass dabei auch Backslashes (sowie einfache Anführungszeichen) in der Zeichenkette berücksichtigt werden (mein PS1-Prompt lautet Osiris JL: ):

Osiris JL: cat zzz
xxx="I'm happy.
You're sad."
yyy=$(echo "$xxx" | sed 's/[\'\'']/\\&/g;s/$/\\n/;$s/\\n$//')
echo "$xxx"
echo $xxx
echo "$yyy"
echo $yyy
#eval echo $yyy
#eval echo "$yyy"
Osiris JL: sh zzz
I'm happy.
You're sad.
I'm happy. You're sad.
I\'m happy.\n
You\'re sad.
I\'m happy.\n You\'re sad.
Osiris JL:

0voto

mschilli Punkte 1834

Hier ist meine Lösung mit awk :

$ awk '{$1=$1}1' FS=\' OFS="\\\'" ORS='\\n' <<< "I'm happy.
You're sad."

Das Ergebnis ist die Ausgabe

I\'m happy.\nYou\'re sad.\n

Erläuterung:

Ich setze das Feldtrennzeichen ( FS ) an ' (wobei es für die shell como \' ) und die Ausgabe Feldtrennzeichen ( OFS ) an \' (eingewickelt in "..." zu entkommen. ' für die shell und die Flucht vor der \ zweimal, einmal für die shell und ein zweites Mal für awk als "\\\'" ). Ohne weitere Optionen wird das Satztrennzeichen ( RS ) ist das Zeilenumbruchzeichen, aber ich setze das Ausgabe Datensatz-Trennzeichen ( ORS ) an \n (wiederum unter Umgehung des \ pour awk como \\n ).

Jetzt bleibt nur noch zu erzählen awk zu tun, ist die Neuberechnung jedes Datensatzes (durch Einstellung von $1 a $1 ändert sich nichts, aber awk ist der Meinung, dass der Datensatz geändert wurde, und zwar durch die Ersetzung FS von OFS und somit jede ' von \' ) und jeden Datensatz ausdrucken (das ist das, was die 1 Muster tut: 1 ist für alle Datensätze wahr, und da keine Aktion angegeben wurde, wird die Standardaktion {print $0} durchgeführt wird), wodurch effektiv die RS von ORS und somit jeder Zeilenumbruch durch \n .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X