sed: The "s" Command

 
 3.3 The 's' Command
 ===================
 
 The 's' command (as in substitute) is probably the most important in
 'sed' and has a lot of different options.  The syntax of the 's' command
 is 's/REGEXP/REPLACEMENT/FLAGS'.
 
    Its basic concept is simple: the 's' command attempts to match the
 pattern space against the supplied regular expression REGEXP; if the
 match is successful, then that portion of the pattern space which was
 matched is replaced with REPLACEMENT.
 
    For details about REGEXP syntax ⇒Regular Expression Addresses
 Regexp Addresses.
 
    The REPLACEMENT can contain '\N' (N being a number from 1 to 9,
 inclusive) references, which refer to the portion of the match which is
 contained between the Nth '\(' and its matching '\)'.  Also, the
 REPLACEMENT can contain unescaped '&' characters which reference the
 whole matched portion of the pattern space.
 
    The '/' characters may be uniformly replaced by any other single
 character within any given 's' command.  The '/' character (or whatever
 other character is used in its stead) can appear in the REGEXP or
 REPLACEMENT only if it is preceded by a '\' character.
 
    Finally, as a GNU 'sed' extension, you can include a special sequence
 made of a backslash and one of the letters 'L', 'l', 'U', 'u', or 'E'.
 The meaning is as follows:
 
 '\L'
      Turn the replacement to lowercase until a '\U' or '\E' is found,
 
 '\l'
      Turn the next character to lowercase,
 
 '\U'
      Turn the replacement to uppercase until a '\L' or '\E' is found,
 
 '\u'
      Turn the next character to uppercase,
 
 '\E'
      Stop case conversion started by '\L' or '\U'.
 
    When the 'g' flag is being used, case conversion does not propagate
 from one occurrence of the regular expression to another.  For example,
 when the following command is executed with 'a-b-' in pattern space:
      s/\(b\?\)-/x\u\1/g
 
 the output is 'axxB'.  When replacing the first '-', the '\u' sequence
 only affects the empty replacement of '\1'.  It does not affect the 'x'
 character that is added to pattern space when replacing 'b-' with 'xB'.
 
    On the other hand, '\l' and '\u' do affect the remainder of the
 replacement text if they are followed by an empty substitution.  With
 'a-b-' in pattern space, the following command:
      s/\(b\?\)-/\u\1x/g
 
 will replace '-' with 'X' (uppercase) and 'b-' with 'Bx'.  If this
 behavior is undesirable, you can prevent it by adding a '\E'
 sequence--after '\1' in this case.
 
    To include a literal '\', '&', or newline in the final replacement,
 be sure to precede the desired '\', '&', or newline in the REPLACEMENT
 with a '\'.
 
    The 's' command can be followed by zero or more of the following
 FLAGS:
 
 'g'
      Apply the replacement to _all_ matches to the REGEXP, not just the
      first.
 
 'NUMBER'
      Only replace the NUMBERth match of the REGEXP.
 
      interaction in 's' command Note: the POSIX standard does not
      specify what should happen when you mix the 'g' and NUMBER
      modifiers, and currently there is no widely agreed upon meaning
      across 'sed' implementations.  For GNU 'sed', the interaction is
      defined to be: ignore matches before the NUMBERth, and then match
      and replace all matches from the NUMBERth on.
 
 'p'
      If the substitution was made, then print the new pattern space.
 
      Note: when both the 'p' and 'e' options are specified, the relative
      ordering of the two produces very different results.  In general,
      'ep' (evaluate then print) is what you want, but operating the
      other way round can be useful for debugging.  For this reason, the
      current version of GNU 'sed' interprets specially the presence of
      'p' options both before and after 'e', printing the pattern space
      before and after evaluation, while in general flags for the 's'
      command show their effect just once.  This behavior, although
      documented, might change in future versions.
 
 'w FILENAME'
      If the substitution was made, then write out the result to the
      named file.  As a GNU 'sed' extension, two special values of
      FILENAME are supported: '/dev/stderr', which writes the result to
      the standard error, and '/dev/stdout', which writes to the standard
      output.(1)
 
 'e'
      This command allows one to pipe input from a shell command into
      pattern space.  If a substitution was made, the command that is
      found in pattern space is executed and pattern space is replaced
      with its output.  A trailing newline is suppressed; results are
      undefined if the command to be executed contains a NUL character.
      This is a GNU 'sed' extension.
 
 'I'
 'i'
      The 'I' modifier to regular-expression matching is a GNU extension
      which makes 'sed' match REGEXP in a case-insensitive manner.
 
 'M'
 'm'
      The 'M' modifier to regular-expression matching is a GNU 'sed'
      extension which directs GNU 'sed' to match the regular expression
      in 'multi-line' mode.  The modifier causes '^' and '$' to match
      respectively (in addition to the normal behavior) the empty string
      after a newline, and the empty string before a newline.  There are
      special character sequences ('\`' and '\'') which always match the
      beginning or the end of the buffer.  In addition, the period
      character does not match a new-line character in multi-line mode.
 
    ---------- Footnotes ----------
 
    (1) This is equivalent to 'p' unless the '-i' option is being used.