У меня есть три строки, которые я ищу в файле. Чтобы найти строки с любой из них, я использую
grep 'string1\|string2\|string3' file
Я хочу распечатать только совпадающие строки в каждой строке, используя флаг -o
. Но в этом случае, если в строке присутствуют две строки, появляется только одна из них. Есть ли способ получить что-то вроде string1
и/или string2
и т. д. без необходимости перечислять 6 случаев с и и или с использованием этот ответ.
Обратите внимание, что я использую OS X Yosemite.
Ожидаемый результат:
string1
string1 string2
string3
string1 string3
string3
и Т. Д.
Можете ли вы включить образец входных данных и ожидаемый результат? — person sodiumnitrate schedule 12.04.2015
@hwnd печатает только одну из этих строк, если в строке существует более одной. — person sodiumnitrate schedule 12.04.2015
@anubhava отредактировал сообщение. — person sodiumnitrate schedule 12.04.2015
Если ваш grep
имеет опцию -n
для отображения совпадающих номеров строк: используйте -n -o
и пост-обработайте вывод grep
с помощью awk. Я не специалист по awk. — person sodiumnitrate schedule 12.04.2015
Вы можете попробовать напечатать номера строк. Повторяющиеся записи не будут иметь номеров строк. Затем просто присоединяйтесь к линии с постобработкой.
В приведенном выше случае
2:string2
иstring3
могут быть объединены вstring2 string3
.Полная команда в Mac OS
последнюю команду
tr
иsed
можно заменить одной командойsed
. но почему-то новый символ строки не работает на Mac sed.Вывод будет похож на этот
У вас есть лишняя конечная цифра
\|
в конце, попробуйтеEDIT: Вы можете использовать этот
grep
с gnu-awk:Это опечатка, которую я сделал, когда писал вопрос. Итак, эта команда печатает второе вхождение в новой строке? Как я могу сохранить их вместе? — person sodiumnitrate; 12.04.2015
Чтобы сохранить их вместе, вы можете просто опустить флаг
-o
, но он напечатает полную строку — person sodiumnitrate; 12.04.2015