Чистый раствор sed
без трубопроводов иtac
В таком случае линейный -за -линейный подход из sed
не помогает. Лучше обработать весь буфер сразу, так как вариант -z
GNU sed
делает (вы, кажется, используете linux и GNU sed
, переносную замену см. в этом Q&A).
Теперь вы можете воспользоваться жадным характером.*
:Шаблон .*apple1
будет соответствовать всему, включая последнее вхождение apple1
, потому что все остальные вхождения поглощаются .*
.
Затем просто добавьте следующие поля(\s+
для разделителя столбцов, [0-9]+
для второго столбца и еще один \s+
, все расширенные регулярные выражения GNU )и окружите их ()
, чтобы вы могли использовать их повторно. в замене как \1
. Затем добавьте третий столбец за пределами ()
, чтобы заменить его, и получится
sed -zE 's/(.*\napple1\s+[0-9]+\s+)[0-9]+/\14444444/'
Вот именно.
Примечание для пользователей, не -GNU sed
:Портативное решение было бы менее удобным:
sed -E 'H;1h;$!d;x;s/(.*\napple1[[:space:]]+[0-9]+[[:space:]]+)[0-9]+/\14444444/'