Требование таково:
Входной файл:
.......
.......
foo ......
.......
.......
foo ......
.......
.......
foo ......
.......
.......
Выходной файл:
.......
.......
foo bar
.......
.......
foo nobar
.......
.......
foo barno
.......
.......
Я подумал о логике и нашел части дляреализовать вышеизложенное.Вот как работает логика.
- Первоначально
lineno=0
- Шаблон сопоставления, начиная с
lineno
до конца файла.Когда шаблон найден, получите номер строки, lineno=<matched line number> + 1
, замените только один раз на 1-е значение. - повторите 2-й шаг со 2-м значением.
- повторите 2-й шаг с 3-м значением.
Я только нашел, как получить номер строки совпавшего шаблона, как заменить только один раз.Но для первой части «начать сопоставление с определенного номера строки файла» я ничего не получаю.
Возможно ли вышеупомянутое требование в linux?
Упомянутая логика предпочтительнеекак это может быть обработано в цикле.Другие идеи / импровизации также приветствуются.
Редактировать 1:
После всех комментариев, это моя первая попытка:
x=($(awk '/foo/ {print NR}' foo_test)) #foo_test contains the above input
sed -i "${x[0]}s/.*/foo bar/" foo_test
sed -i "${x[1]}s/.*/foo nobar/" foo_test
sed -i "${x[2]}s/.*/foo barno/" foo_test
ЕстьЕсть ли другое лучшее решение?