шаблон соответствия linux после номера строки до конца и один раз заменить - PullRequest
0 голосов
/ 30 мая 2019

Требование таково:

Входной файл:

.......
.......
foo ......
.......
.......
foo ......
.......
.......
foo ......
.......
.......

Выходной файл:

.......
.......
foo bar
.......
.......
foo nobar
.......
.......
foo barno
.......
.......

Я подумал о логике и нашел части дляреализовать вышеизложенное.Вот как работает логика.

  1. Первоначально lineno=0
  2. Шаблон сопоставления, начиная с lineno до конца файла.Когда шаблон найден, получите номер строки, lineno=<matched line number> + 1, замените только один раз на 1-е значение.
  3. повторите 2-й шаг со 2-м значением.
  4. повторите 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

ЕстьЕсть ли другое лучшее решение?

1 Ответ

0 голосов
/ 06 июня 2019

Вот пример сценария awk для выполнения задачи за один раз.

входной файл input.txt:

line 1
foo line 2
foo line 3
line 4
foo line 5
foo line 6
line 7
line 8
foo line 9
foo line 10
line 11
foo line 12

скрипт awk script.awk:

/^foo / {               # for each input line starting with foo
    fooCount++;         # increment foo coutner
    if (fooCount%3 == 1) $1 = $1" bar";   # First match. Add bar to 1st field
    if (fooCount%3 == 2) $1 = $1" nobar"; # Second match. Add nobar to 1stfield
    if (fooCount%3 == 0) $1 = $1" barno"; # Third match. Add barno to 1st field
}
1                       # print current line

команда запуска:

awk -f script.awk input.txt

выход:

line 1
foo bar line 2
foo nobar line 3
line 4
foo barno line 5
foo bar line 6
line 7
line 8
foo nobar line 9
foo barno line 10
line 11
foo bar line 12

Прокомментируйте, пожалуйста

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...