The colons :
are delimiters for the pattern (left) and substitution (right). g
tells sed to "globally" substitute (change everything that matches the pattern on each line, rather than only the first on a given line).
Three colons are used, because you need three delimiters. So :g
is really two things: the last delimiter and the modifier "g".
The quotation mark is used in case this part of the expression "${path1}"
contains some character (when the variable is substituted) that would make an error in the command. For instance, if it contained a space or tab, that would break the substitution parameter passed by the shell to sed
into two parts (an error).
So... this command
sed -i -e s:INPUT_REPLACE:"${path1}":g ${path2}
tells sed
to read/write the same file (the -i
option). The file is ${path2}
. It looks for lines containing "INPUT_REPLACE"
, and replaces that string on each line with whatever is in the variable ${path1}
. It does that for each occurrence of "INPUT_REPLACE"
on each line.
By the way: if "${path1}" contains "INPUT_REPLACE" (or the substitution makes an occurrence), sed
will not redo things and substitute again. It only does this on the initial matches.
The -i
option is not in POSIX, but is available with Linux and BSDs.
s:INPUT_REPLACE:"${path1}":g
syntax looks weird to you, and you want an alternative, you can use"s:INPUT_REPLACE:${path1}:g"
instead (moving the quotes from the inside to the beginning and the end), and (2) you should probably put"$path2"
into quotes, too. (You can leave the braces in; e.g.,"${path2}"
, but they are unnecessary in this context. See this and this for more information) – G-Man Says 'Reinstate Monica' Sep 08 '16 at 03:34