How can I add a backslash before all spaces?
34,862
Solution 1
tr
can't do multiple characters. Use one of these instead:
sed
echo "$line" | sed 's/ /\\ /g'
or
sed 's/ /\\ /g' <<< "$line"
Perl
echo "$line" | perl -pe 's/ /\\ /g'
or
perl -pe 's/ /\\ /g'<<< "$line"
Perl also has a nifty function called
quotemeta
which can escape all odd things in a string:line='@!#$%^&*() _+"' perl -ne 'print quotemeta($_)' <<< $line
The above will print
\@\!\#\$\%\^\&\*\(\)\ _\+\"\
You can also use
printf
and%q
:%q quote the argument in a way that can be reused as shell input
So, you could do
echo "$line" | printf "%q\n"
Note that this, like Perl's
quotemeta
will escape all special characters, not just spaces.printf "%q\n" <<<$line
If you have the line in a variable, you could just do it directly in bash:
echo ${line// /\\ }
Solution 2
There is AWK
missing in the list of all the possible solutions :)
$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'
Hello\ World
Related videos on Youtube
Author by
daka
Updated on September 18, 2022Comments
-
daka over 1 year
How can I put a backslash before every space, preferably by using
tr
orsed
commands?Here is my script:
#!/bin/bash line="hello bye" echo $line | tr ' ' "\\\ "
This is supposed to replace spaces with a backslash followed by a space, but it's only replacing the spaces with a backslash and not backlash+space.
This is the output I get:
hello\bye
Expected output:
hello\ bye
-
Fabby about 9 yearsCould you please elaborate a bit on that? Are you looking for a script that changes a text file? What exactly are you looking for?
-
-
daka about 9 yearsyes this works, but does not work when wanting to replace all occurences of "a" with a backlash+space.
-
terdon about 9 years@sudoman I added some more options since you have the line in a variable already.
-
evilsoup about 9 yearsBash's
printf
builtin has functionality similar toquotemeta
--printf '%q\n' "$line"
should do it IIRC.