About replacing string with sed - sed

I'd like to replace all the \r\n with < br/ >in a document, and I'm trying this see script below
# sed -i 's/\r\n/<br/>' ~/xxd/*
however i got this error back
sed: -e expression #1, char 12: unknown option to `s'
How do i solve this problem?
Thanks!

Your problem is that you have the / separator in your replacement string so sed is assuming that's the end of your replacement, and that the > following it is a flag.
If your sed is modern enough, just use a different separator character, one that's not in the replacement string:
pax$ echo hello | sed -e 's/e/<br />/'
sed: -e expression #1, char 9: unknown option to `s'
pax$ echo hello | sed -e 's?e?<br />?'
h<br />llo
Alternatively, you can escape the offending character but I try to avoid that since it tends to lead to overly sawtooth sed commands like /\/\/\/\/\/\.
The other thing you may want to watch out for is trying to use \n in your regex since sed operates on lines anyway. If your intent is to just strip carriage returns and insert HTML line breaks, then the following sed command may be better:
s?\r$?<br />?

Related

sed replace two open brackets with a single one

I have a file containing lines like
echo ((hello world))
I want the output to be
echo (hello world)
Any idea how I can accomplish this with sed?
sed 's/echo \(\(/echo \(\/' myfile
sed: -e expression #1, char 21: unterminated `s' command
You accidentally escaped the delimiter:
sed 's/echo \(\(/echo \(\/' myfile
^
I see you're not using sed -E, so it's better thet you drop all slashes as in BRE, brackets and braces shouldn't be escaped, as opposed to ERE. So the correct command would be (either of the two):
sed 's/echo ((/echo (/' myfile
sed -E 's/echo \(\(/echo \(/' myfile

Why does this 'sed' fail inside qx() in Perl?

This sed works, to replace the value for Java home in a shell script:
sed -i 's#^JAVA_HOME=.*$#JAVA_HOME="/usr/lib/jvm/java-1.7.0-oracle.x86_64"#' /apps/tempbsu.sh
but now I am trying to use/invoke that sed from inside a Perl app, using qx():
qx(sed -i 's#^JAVA_HOME=.*$#JAVA_HOME="/usr/lib/jvm/java-1.7.0-oracle.x86_64"#' /apps/tempbsu.sh);
and when I do that, I am getting an error:
sed: -e expression #1, char 58: unterminated `s' command
From checking, I gather that error is happening because the sed is missing the last delimiter, but it seems like it is correct, i.e.:
sed -i 's#.....#.......#' /apps/tempbssu.sh
Can someone tell me why this sed is failing with I use in a qx() in Perl?
$#JAVA_HOME is treated as a Perl variable (the number of the last element of the array variable). Escape it: \$#JAVA_HOME

SED: unterminated `s' command at hyphen

I'm running the following in my provisioner
sed -i 's/DocumentRoot \/var\/www\/DocumentRoot \/var\/www\/app\/web-root\/\g' /etc/apache2/sites-available/000-default.conf
however I'm getting the error: sed: -e expression #1, char 69: unterminated 's' command - which is a hyphen (-) at that position. I've tried escaping it (\-) to no avail.
Any ideas?
your line:
sed -i 's/DocumentRoot \/var\/www\/DocumentRoot \/var\/www\/app\/web-root\/\g ...
^
sed needs s/.../.../g you have escaped the last / before g flag, more than that, you escaped g flag too. At least this mistake won't let your sed command go.
what better is, you pick another delimiter, if your pattern/replacement containing /(slash) too. It can save those dozens back slashes:
sed -i 's#foo/bar/blah#foo1/bar1/blah1#g` file

Write Dollar sign in sed command pattern inside makefile

I have a makefile that contains this command:
sed '/^$/d'
when I ran it I got:
sed '/^d'
sed: -e expression #1, char 3: unterminated address regex
looks like it interprets the dollar sign, how can I prevent that from happening?
You have to double all dollar signs in a recipe, otherwise make treats them as introducing a make variable:
sed '/^$$/d'
If you search for "dollar sign makefile" or similar you'll find tens if not hundreds of answers to virtually this exact question.
Use $$, it becomes $. See Special Characters in a Makefile
Makefile:
sed '/^$$/d'
learts#Fastidio:~/tmp$ make
sed '/^$/d'

sed change line error message

I have a config file I need to change (again) and the line is
set wrapper_code=C:\windows\drivers\cache
I need to change it to
set wrapper_code=/home/harry/solo/run
I wrote
cat Proxy.bat | sed -i.bk -e 's/\(^set wrapper_home\=\).*/\/home/'1${dbuser}'/gateway/service\' Proxy.bat
I get an error message
sed: -e expression #1, char 37: unknown option to `s'
What is wrong with my code string
If you are using / as the pattern separator is sed, you have to escape the slashes in the strings (paths). To avoid it, use a different separator:
sed -i.bk -e 's%\^set wrapper_code=C:\\windows\\drivers\\cache%set wrapper_code=/home/harry/solo/run%' Proxy.bat
You also have to escape backslashes, as they have a special meaning in sed.
The cat part is useless.