How can one replace a part of a line with sed?
The line
DBSERVERNAME xxx should be replaced to:
DBSERVERNAME yyy The value xxx can vary and there are two tabs between dbservername and the value. This name-value pair is one of many from a configuration file.
I tried with the following backreference:
echo "DBSERVERNAME xxx" | sed -rne 's/\(dbservername\)[[:blank:]]+\([[:alpha:]]+\)/\1 yyy/gip' and that resulted in an error: invalid reference \1 on `s' command's RHS.
Whats wrong with the expression? Using GNU sed.
This works:
sed -rne 's/(dbservername)\s+\w+/\1 yyy/gip' (When you use the -r option, you don't have to escape the parens.)
Bit of explanation:
-r is extended regular expressions - makes a difference to how the regex is written.-n does not print unless specified - sed prints by default otherwise,-e means what follows it is an expression. Let's break the expression down: s/// is the command for search-replace, and what's between the first pair is the regex to match, and the second pair the replacement,gip, which follows the search replace command; g means global, i.e., every match instead of just the first will be replaced in a line; i is case-insensitivity; p means print when done (remember the -n flag from earlier!),dbservername is the first match part,\s is whitespace, + means one or more (vs *, zero or more) occurrences,\w is a word, that is any letter, digit or underscore,\1 is a special expression for GNU sed that prints the first bracketed match in the accompanying search.Others have already mentioned the escaping of parentheses, but why do you need a back reference at all, if the first part of the line is constant?
You could simply do
sed -e 's/dbservername.*$/dbservername yyy/g'
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