Capturing the error stream from a sed command - sed

How do I capture any error from a sed command into a file? Here is the sed command I am using:
sed -e 's/'old_word'/'new_word'/' temp_file > output_file
Now, when everything goes well, modified contents from temp_file are captured in output_file. But let's say that output_file happens to be read only. In this case, instead of error being shown on screen , I would like it to be redirected to error_file. How can I do that? I tried adding 2> error_file to the end of the above command but that did not work.
Thanks.

Following command works for me like charm:
sed -e 's/'old_word'/'new_word'/' temp_file > output_file 2> sed_error
Just make sure you didn't put space between 2 and >.

sed -e 's/'old_word'/'new_word'/' temp_file > output_file 2>error_file

Related

Multiple expressions in one command using the -e option (sed)

Use the –e option to include 2 replace commands for an example file:
1 to replace all “erors” with “errors” and
1 to replace all last words with “final.”
What command will do this?
This would work:
sed 's/erors/errors/g;s/last/final/g'
As well as:
sed -e 's/erors/errors/g' -e 's/last/final/g'
In awk you can do
cat file
these are all erors that I have
awk '{sub(/erors/,"errors");$NF="final"}1' file
these are all errors that I final

Trying to overwrite a string that has single quotes using Perl or sed in the terminal

I have the following line in a file:
$app-assets:"/assets/";
I am trying to use sed in the terminal to overwrite that line to read as follows:
$app-assets:"http://www.example.com/assets/";
I have tried the following but it does not work:
sed -i \'\' -e \'s/app-assets:"/assets/"/app-assets:"http://www.example.com/assets/"/g\' myfile.txt
I am fine using Perl if easier.
Use the following sed approach:
sed -i 's~\(\$app-assets:"\)\(/assets/\)"~\1http://www.example.com\2"~' myfile.txt
~ here is treated as sed subcommand separator
sed 's/app-assets:\"\/assets\/\";/app-assets:\"http:\/\/www\.example\.com\/assets\/\";/g' filename

using sed to replace string with special characters

I'm basically trying to modify tomcat server.xml connector tag and add a address attribute to it.
I want to find the below string in server.xml
I'm doing the below with sed,
export currlistener=\<Connector\ port\=\"18443\"
export newlistener=\<Connector\ port\=\"18443\"\ address\=\"127.0.0.1\"\
echo $currlistener
echo $newlistener
sed -i -e 's/'$currlistener'/'$newlistener'/g' server.xml
But I get the error
sed: -e expression #1, char 12: unterminated `s' command
I guess sed is interpreting the special characters and erroring out.
How would I do the same using awk?
Regards,
Anand.
Using sed
The problem was that the shell variables were unquoted. Try:
sed -i -e "s/$currlistener/$newlistener/g" server.xml
Using awk
The sed solution requires that you trust the source of your shell variables. For a case like this, awk is safer. Using a modern GNU awk:
awk -i inplace -v a="$currlistener" -v b="$newlistener" '{gsub(a, b)} 1' server.xml
Or, using other awk:
awk -v a="$currlistener" -v b="$newlistener" '{gsub(a, b)} 1' server.xml >tmp && mv tmp server.sml
Simplifying the variable assignments
Separately, the shell variables can be defined without requiring so many escapes:
currlistener='<Connector port="18443"'
newlistener='<Connector port="18443" address="127.0.0.1"'
It is only necessary to export them if they are to be used in a child process.

sed: find and replace string but not super-string

I have a file env which looks like
....
LEGACY_DATABASE_SERVER=10.0.0.1
SERVER=10.1.1.1
and here is my sed command:
sed -e "s/SERVER=.*/SERVER=$INSTANCE_IP/g;n" $ENV_FILE > $ENV_FILE.tmp && mv $ENV_FILE.tmp $ENV_FILE
the problem is that sed is also replacing LEGACY_DATABASE_SERVER which is not what I want. I only want SERVER replaced.
(LEGACY_DATABASE_SERVER is a super string of SERVER and I only want to replace SERVER)
What am I missing?
Presumably, you want to make sure that sed knows "SERVER" is at the beginning of the line:
sed -e "s/^SERVER=.*/SERVER=$INSTANCE_IP/g;n" $ENV_FILE > $ENV_FILE.tmp && mv $ENV_FILE.tmp $ENV_FILE

Delete all the lines in a file that contains a specific character

I want to delete all the rows/lines in a file that has a specific character, '?' in my case. I hope there is a single line command in Bash or AWK or Perl. Thanks
You can use sed to modify the file "in-place":
sed -i "/?/d" file
Alternatively, use grep:
grep -v "?" file > newfile.txt
Even better, just a single line using sed
sed '/?/d' input
use -i to edit file in place.
perl -i -ne'/\?/ or print' file
or
perl -i -pe's/^.*?\?.*//s' file
Here are already grep, sed and perl solutions - only for fun, pure bash one:
pattern='?'
while read line
do
[[ "$line" =~ "$pattern" ]] || echo "$line"
done
translated
for every line on the STDIN
match it for the pattern =~
and if the match is not successful || - print out the line
awk '!($0~/?/){print $0}' file_name