Mit sed zu ersetzen einen string mit dem Inhalt einer variable, auch wenn es ein escape-Zeichen
Ich bin mit
sed -e "s/\*DIVIDER\*/$DIVIDER/g"
zu ersetzen *DIVIDER*
mit einem vom Benutzer angegebenen string, der gespeichert ist in $DIVIDER
. Das problem ist, dass ich will, dass Sie in der Lage, geben Sie die escape-Zeichen, da Ihre Teiler, wie \n oder \t. Wenn ich versuche, ich am Ende mit dem Buchstaben n oder t oder so auf.
Hat jemand irgendwelche Ideen auf, wie dies zu tun? Es wird sehr geschätzt werden!
EDIT: Hier das Fleisch, das Skript, ich muss etwas fehlen.
curl --silent "$URL" > tweets.txt
if [[ `cat tweets.txt` == *\<error\>* ]]; then
grep -E '(error>)' tweets.txt | \
sed -e 's/<error>//' -e 's/<\/error>//' |
sed -e 's/<[^>]*>//g' |
head $headarg | sed G | fmt
else
echo $REPLACE | awk '{gsub(".", "\\\\&");print}'
grep -E '(description>)' tweets.txt | \
sed -n '2,$p' | \
sed -e 's/<description>//' -e 's/<\/description>//' |
sed -e 's/<[^>]*>//g' |
sed -e 's/\&\;/\&/g' |
sed -e 's/\<\;/\</g' |
sed -e 's/\>\;/\>/g' |
sed -e 's/\"\;/\"/g' |
sed -e 's/\&....\;/\?/g' |
sed -e 's/\&.....\;/\?/g' |
sed -e 's/^ *//g' |
sed -e :a -e '$!N;s/\n/\*DIVIDER\*/;ta' | # Replace newlines with *divider*.
sed -e "s/\*DIVIDER\*/${DIVIDER//\\/\\\\}/g" | # Replace *DIVIDER* with the actual divider.
head $headarg | sed G
fi
Lange Liste von sed-Leitungen ersetzen von Zeichen aus einem XML-Quelle, und die letzten zwei sind diejenigen, die Sie ersetzen sollen, die Zeilenumbrüche, die mit dem angegebenen Zeichen. Ich weiß, es scheint überflüssig, zu ersetzen, eine newline mit einem anderen Zeilenumbruch, aber es war der einfachste Weg, könnte ich kommen mit, lassen Sie Sie Holen Ihre eigenen Teiler. Der Teiler Ersatz funktioniert Super mit normalen Zeichen.
InformationsquelleAutor vilhalmer | 2010-02-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nutzen bash, um die Flucht der backslash wie diese:
Die syntax ist
${name/pattern/string}
. Wenn das Muster beginnt mit/
jedes auftreten vonpattern
imname
wird ersetzt durchstring
. Andernfalls wird nur das erste vorkommen ersetzt wird.tangens' Lösung beschäftigt sich mit den backslashes, aber nicht das \n oder \t. Das problem ist, dass die sed nicht erkannt \n oder \t. Sie können entweder legen Sie Sie in TEILER explizit, oder leiten Sie die Ausgabe durch einen anderen filter ersetzt \n mit einem Zeilenumbruch. Beispiel: sed 's/\\n/\<ret>/g'
Das ist eine gute Idee, könnte ich Pfeife Sie zurück durch die tr auf dem Weg nach draußen. Danke!
InformationsquelleAutor tangens
Vielleicht:
Spielte ich mit diesem script:
Laufen mit 'ksh' oder 'bash' (aber nicht 'sh') auf MacOS X:
InformationsquelleAutor Jonathan Leffler
Scheint es sich um eine einfache substitution:
Vielleicht ich verstehe nicht, was du versuchst zu erreichen.
Dann vielleicht dieser Schritt könnte das stattfinden der letzten beiden von Euch:
Beachten Sie das Leerzeichen nach dem dollar-Zeichen. Es verhindert, dass die shell interpretiert "${s..." als Namen einer Variablen.
Und als ghostdog74 vorgeschlagen, Sie haben viel zu viele Anrufe, zu
sed
. Sie können in der Lage sein zu ändern, eine Menge von pipe-Zeichen umgekehrte Schrägstriche (Zeile Fortsetzung) löschen und "sed" von allen, aber die erste (verlassen der "-e" überall). (ungetestet)Ich habe versucht, die Kombination der Anrufe sowohl mit der Fortsetzung und alle auf einer Linie, aber einige der Ersatz aufhören zu arbeiten. Es entfernt nicht mehr die <description> - tags oder den zusätzlichen Platz. Gibt es eine Magie, um Sie, dass Sie müssen?
Haben, verlassen Sie diese an Ort und Stelle?
sed -n '2,$p' | sed ...
Sie die Auswahl, welche Linien zu handeln, um auf dies zu tun. Wenn Sie nehmen Sie die Pfeife hier, es könnte nicht funktionieren. Ohne zu sehen, Daten und Ihre überarbeitete Skript kann ich nicht sicher sagen. Sie sollten sich bewusst sein, dass auf diese Weise Wahnsinn liegt (mit regexes auf HTML): stackoverflow.com/questions/1732348/...InformationsquelleAutor Dennis Williamson
Brauchen Sie nur auf escape die escape-char.
\n match \n
\ entsprechen \
\\ entsprechen \
InformationsquelleAutor Daniel Ice
FreeBSD-sed (z.B. auf Mac OS X) Sie haben Vorverarbeiten der $TEILER von Benutzereingaben:
InformationsquelleAutor carlo