sed: Replace part of a line

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!),
    • The brackets represent a match part, which will come up later. So 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.

Leave a Comment