Использование grep для печати одной из перечисленных строк, но для печати их всех, если существует более одной

У меня есть три строки, которые я ищу в файле. Чтобы найти строки с любой из них, я использую

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

См. также:  Прерывание клавиатуры в режиме отладки PyCharm
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. sodiumnitrate

    Вы можете попробовать напечатать номера строк. Повторяющиеся записи не будут иметь номеров строк. Затем просто присоединяйтесь к линии с постобработкой.

    grep -Eon 'string1|string2|string3' txt 
    
    1:string1
    2:string2
    string3
    3:string3
    4:string1
    string2
    

    В приведенном выше случае 2:string2 и string3 могут быть объединены в string2 string3.

    Полная команда в Mac OS

     grep -Eon 'string1|string2|string3' txt | tr  '\n' ' ' 
     | sed -E 's/ [0-9]:/:/g' | tr ':' '\n'
    

    последнюю команду tr и sed можно заменить одной командой sed. но почему-то новый символ строки не работает на Mac sed.

    Вывод будет похож на этот

    string1
    string2 string3
    string3
    string1 string2 string3 
    
  2. sodiumnitrate

    У вас есть лишняя конечная цифра \| в конце, попробуйте

    grep -o 'string1\|string2\|string3' file
    string1
    string1
    string2
    string3
    string1
    string3
    string3
    

    EDIT: Вы можете использовать этот grep с gnu-awk:

    grep -no 'string1\|string2\|string3' file | awk -v RS='[0-9]+:' 'NR>1{
          gsub(/\n/, "\t"); print}'
    

    Это опечатка, которую я сделал, когда писал вопрос. Итак, эта команда печатает второе вхождение в новой строке? Как я могу сохранить их вместе? person sodiumnitrate; 12.04.2015

    Чтобы сохранить их вместе, вы можете просто опустить флаг -o, но он напечатает полную строку person sodiumnitrate; 12.04.2015

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: