Для простоты я предполагаю, что вы хотите заменить каждое foo
вхождение после первого :
на FOO
.
sed 'h # save the current line in the hold space
s/[^:]*:// # delete everything up to the marker
s/foo/FOO/g # YOUR COMPLICATED COMMAND GOES HERE
x # swap pattern and hold space
s/:.*/:/ # delete from the first : to the end in the original line
G # append hold space (: with whatever follows it)
s/\n//' yourfile # remove the newline that comes with G
Приведенный выше код является обновлением на предложение, полученное в комментарии.
Оригинальный ответ ниже. Даже если в этом случае это немного излишне, это показывает, что вы можете использовать нулевой символ в sed
, \x0
, в качестве «маркера», который, как вы можете предположить, отсутствует в текстовом файле (в отличие от используя, например, _xxx_
, который потенциально может быть уже в файле). (Эта вторая версия заменяет вхождения foo
до :
, в соответствии с тем, когда я неправильно прочитал вопрос. )
sed 'h # save the current line in the hold space
s/:/\x0:/ # mark the first : by prepending a null character
s/.*\x0// # delete everything up to the marker
x # swap pattern and hold space
s/:.*// # delete from the first : to the end in the original line
s/foo/FOO/g # YOUR COMPLICATED COMMAND GOES HERE
G # append hold space (: with whatever follows it)
s/\n//' yourfile # remove the newline that comes with G