I have a plain text document, which I want to compile inside LaTeX. However, sometimes it has the characters, "#", "$", "%", "&", and "_". To compile properly in LaTeX, I must first replace these characters with "#", "\$", "\%", "\&", and "_". I have used this line 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
Is this correct?
Unfortunately, the file is too large to open in any GUI software, so checking if my sed
line is correct with a text editor is difficult. I tried searching with grep
, but the search does not work as expected (e.g. below, I searched for any lines containing "$"):
grep "\$" file.txt
grep
to successfully check the lines with the replacements?You can do the replacement with a single call to sed
:
sed -i -E 's/([#$%&_\])/\\&/g' file.txt
The &
in the replacement text fills in for whichever single character is enclosed in parentheses. Note that since \
is the LaTeX escape character, you'll have to escape it as well in the original file.
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
You don't need the \
on the first (search) string on most of them, just $
(it's a special character, meaning the end of a line; the rest aren't special). And in the replacement, you only need two \\
, not three. Also, you could do it all in one with several -e
statements:
sed -i.bak -e 's/#/\\#/g' \
-e 's/\$/\\$/g' \
-e 's/%/\\%/g' \
-e 's/&/\\&/g' \
-e 's/_/\\_/g' file.txt
You don't need to double-escape anything (except the \\
) because these are single-quoted. In your grep
, bash
is interpreting the escape on the $
because it's a special character (specifically, a sigil for variables), so grep
is getting and searching for just the $
, which is a special character meaning the end of a line. You need to either single-quote it to prevent bash
from interpreting the \
('\$'
, or add another pair of \\
: "\\\$". Presumably, that's where you're getting the
\` from, but you don't need it in the sed
as it's written.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With