Повторять целые строки с grep для нескольких экземпляров в одной строке

Ответ на этот вопрос:

При поиске строки «banana» из следующего файла мы хотели бы получить 1,2,3 и 7 экземпляров строк 1,2,3 и 4 соответственно , Количество выходов grep должно совпадать с количеством экземпляров совпадений, все еще возвращая всю строку.

There is one banana here
There are two banana banana here
There are three banana banana banana here
Basically there is no limit to how many banana banana banana banana banana banana banana we can have
In fact we need not have any too!

Примечание. Если мы удалим ограничение целых строк на выходе, мы имеем:

grep -no "banana" tempfile 

, который возвращает

1:banana
2:banana
2:banana
3:banana
3:banana
3:banana
4:banana
4:banana
4:banana
4:banana
4:banana
4:banana
4:banana

Любые идеи?

EDIT: Это назначенный вывод

1 There is one banana here
2 There are two banana banana here
2 There are two banana banana here
3 There are three banana banana banana here
3 There are three banana banana banana here
3 There are three banana banana banana here
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have
1
задан 13 April 2017 в 15:23

2 ответа

Используя оператор повторения строки perl, получив количество повторов, оценив результат совпадения в скалярном контексте:

$ perl -pe '$_ x= (() = /banana/g)' file
There is one banana here
There are two banana banana here
There are two banana banana here
There are three banana banana banana here
There are three banana banana banana here
There are three banana banana banana here
Basically there is no limit to how many banana banana banana banana banana banana banana we can have
Basically there is no limit to how many banana banana banana banana banana banana banana we can have
Basically there is no limit to how many banana banana banana banana banana banana banana we can have
Basically there is no limit to how many banana banana banana banana banana banana banana we can have
Basically there is no limit to how many banana banana banana banana banana banana banana we can have
Basically there is no limit to how many banana banana banana banana banana banana banana we can have
Basically there is no limit to how many banana banana banana banana banana banana banana we can have
3
ответ дан 23 May 2018 в 03:10
  • 1
    Благодаря! Но я принимаю ответ от @Serg, потому что это легче понять. – Manoj Kumar 21 December 2016 в 23:25

Не очень красиво, но вы можете использовать что-то вроде

awk '{print NR, gsub(/banana/, "")' <tempfile

. Он работает с помощью команды awk gsub, чтобы подставить шаблон соответствия (здесь, банан), и он возвращает сколько раз он выполняет замену. Если затем вывести номер строки ввода и количество совпадений

Или повторить линию ввода несколько раз

awk '{A=$0
b=gsub(/banana/, "")
for (i=1; i<=b; i++) print A
}' <tempfile
0
ответ дан 23 May 2018 в 03:10

Другие вопросы по тегам:

Похожие вопросы: