Ersetzen "#", "$", "%", "&" und "_" mit "\#", "\$", "\%", "\&" und "\_"
Habe ich eine nur-text-Dokument, die ich möchte zu kompilieren innen LaTeX. Aber manchmal hat es die Zeichen, "#", "$", "%", "&" und "_". Zum kompilieren richtig in LaTeX, ich muss zuerst ersetzen Sie diese Zeichen durch "#", "\$", "\%", "\&" und "_". Ich habe diese Zeile in sed
:
sed -i 's/\#/\\\#/g' ./file.txt
sed -i 's/\$/\\\$/g' ./file.txt
sed -i 's/\%/\\\%/g' ./file.txt
sed -i 's/\&/\\\&/g' ./file.txt
sed -i 's/\_/\\\_/g' ./file.txt
Ist das richtig?
Leider ist die Datei zu groß zum öffnen in einem beliebigen GUI-software, also die überprüfung, ob meine sed
Zeile korrekt mit einem text-editor, ist schwierig. Ich habe versucht, die Suche mit grep
, aber die Suche funktioniert nicht wie erwartet (z.B. unten, ich suchte für alle Zeilen, die mit "$"):
grep "\$" file.txt
- Was ist der beste Weg, um die "\" vor diesen Zeichen?
- Wie kann ich
grep
erfolgreich überprüfen Sie die Zeilen mit Ersetzungen?
Können Sie garantieren keine speziellen Zeichen, die BEREITS entgangen?
Wie funktioniert der grep arbeiten, wenn auch nicht wie erwartet?
Wenn ich
Ich denke, es ist unwahrscheinlich, es sind bereits geflohen Zeichen in dem Dokument. "\" scheint ziemlich Häufig, aber ich weiß nicht, Situationen, in denen es als escape-Zeichen verwendet.
Versuchen
Wie funktioniert der grep arbeiten, wenn auch nicht wie erwartet?
Wenn ich
grep "\$" file.txt
es zu sein scheint, drucken alles oder fast alles. Ich weiß nicht, warum er den Druck, so viel text, wie "$" ist ganz selten.Ich denke, es ist unwahrscheinlich, es sind bereits geflohen Zeichen in dem Dokument. "\" scheint ziemlich Häufig, aber ich weiß nicht, Situationen, in denen es als escape-Zeichen verwendet.
Versuchen
grep '\\\$' file.txt
. Wenn Sie nicht entkommen können den umgekehrten Schrägstrich (und die dollar-Zeichen), dann die dollar-Zeichen maskiert, die erzählt grep
um eine wortwörtliche "$" (statt am Ende der Zeile - da "$" hat eine Besondere Bedeutung in regexes).InformationsquelleAutor Village | 2012-01-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie den Ersatz mit einem einzigen Aufruf
sed
:Den
&
im Ersetzungstext füllt je nachdem, in welcher einzelne Zeichen ist in Klammern eingeschlossen. Beachten Sie, dass seit\
ist das LaTeX-escape-Zeichen, die Sie haben, um es zu entkommen, als auch in der original-Datei.Die Klammern sind nicht notwendig. Einige Versionen von
sed
nicht unterstützen-E
, aber verwenden-r
statt. Einige Versionen vonsed
erfordern eine Erweiterung nach-i
, aber seit der OP nicht in der Frage, es ist sicher anzunehmen, es ist nicht nötig.Gute Punkte, alle. Ich wollte zu erwähnen, dass -E hängt von der version der sed in Gebrauch, muss aber gelöscht haben, wird es aus der finalen version.
Tatsächlich werden Sie wahrscheinlich wollen, um zu ändern
` to
\textbackslash` da`\`, bricht die Linie.InformationsquelleAutor chepner
Brauchen Sie nicht die
\
auf der ersten (such -) string auf die meisten von Ihnen, nur$
(es ist ein besonderes Zeichen, das heißt das Ende einer Zeile; der rest sind nicht special). Und in den Austausch, brauchen Sie nur zwei\\
, nicht drei. Auch könnte man es machen, alles in eine mit mehreren-e
Aussagen:Brauchen Sie nicht die Doppel-escape-alles (außer die
\\
), da diese in einfachen Anführungszeichen. In Ihremgrep
,bash
ist die Interpretation der Flucht auf der$
weil es ein Sonderzeichen (speziell, ein Siegel für Variablen), sogrep
ist immer und auf der Suche nach der$
, das ist ein besonderes Zeichen für das Ende einer Zeile. Sie müssen entweder single-quote), um zu verhindern, dassbash
aus der Auslegung der\
('\$'
oder fügen Sie ein weiteres paar von\\
:"\\\$". Presumably, that's where you're getting the
\`, aber Sie brauchen es nicht in dersed
wie es geschrieben ist.` (e.g.
\\`) vor?Nicht in den Austausch.
InformationsquelleAutor Kevin
Ich glaube, dein problem ist, dass bash selbst ist der Umgang mit diesen Fluchten.
\#
ist bereits geflohen. Wenn das ist nicht, was Sie wollen, möchten Sie vielleicht ändern Sie Ihre Muster, um zu überprüfen, dass es nicht eine vorhergehende \ bereits.grep "\\$" file.txt
sollte das tun, was Sie erwarten.InformationsquelleAutor wim
Reagiere ich nicht für
sed
, die anderen Antworten sind gut enougth 😉Können Sie
less
als viewer, um zu überprüfen Ihre riesige Datei (odermore
, aberless
ist bequemer alsmore
).Für die Suche, die Sie verwenden können
fgrep
: es ignoriert regulärer Ausdruck =>fgrep '\$'
wirklich nach text suchen\$
.fgrep
ist das gleiche wie das aufrufengrep -F
.BEARBEITEN:
fgrep '\$'
undfgrep "\$"
unterschiedlich sind. Im zweiten Fallbash
interpretiert die Zeichenfolge und ersetzt Sie durch ein einzelnes Zeichen:$
(d.h.fgrep
suchen$
nur).InformationsquelleAutor olibre