Найти первое вхождение строки после первого вхождения другой строки с помощью bash - PullRequest
1 голос
/ 31 мая 2019

У меня есть входной файл, который выглядит следующим образом, и я хочу первое вхождение слов, но только после первого вхождения специального

Числа только там, так что я знаю, что получил правильную строку

РЕДАКТИРОВАТЬ: я понял, что имеет значение, что строки имеют / '

words/and/stuff #1
words/more #2
some/other/words #3
special/this #1
words/i/need/you/i.really.need.you #4
special/cool #2 
words/random #5

Я пытаюсь найти первое вхождение "слова" после того, как нахожу первое вхождение "особого"

Вывод должен быть

words/i/need/you/i.really.need.you #4

Я попробовал следующее

grep -m1 special file | grep -m1 words file 

awk 'NR==1,/special/ && NR==1,/words/ {print $0}' file 

Ответы [ 3 ]

1 голос
/ 31 мая 2019

Попробуйте:

$ awk '/special/{f=1} f && /words/ {print; exit}' file 
words/i/need/you/i.really.need.you #4

Как это работает:

  • /special/{f=1}

    Если текущая строка соответствует special, тогда установить переменную f в 1

  • f && /words/ {print; exit}

    Если f не равен нулю и текущая строка соответствует words, выведите текущую строку и выйдите.

Слова с косой чертой

Если слово, которое вы хотите сопоставить, не просто окружено косыми чертами, но включает их, работает тот же код. Нужно просто избежать косых черт. Например, если мы ищем слово words/i/need после special:

$ awk '/special/{f=1} f && /words\/i\/need/ {print; exit}' file 
words/i/need/you/i.really.need.you #4
0 голосов
/ 31 мая 2019

Не могли бы вы попробовать следующее.

awk '
$0=="words"{
  count++
  if(special_count==1){
    print "String words count is: "count
    exit
  }
}
/special/{
  special_count++
}
'  Input_file
0 голосов
/ 31 мая 2019

Быстрый выделенный sed скрипт

U может использовать для этого:

sed -e  '/special/,${ /word/q;d };d' file

Будет выводить из вашего образца:

words #4
  • От строки, содержащей special, до конца ввода,

    • если строка содержит word, то выйти
    • иначе удалить строку.
  • иначе, удалить строку.

Pure , так как ваш вопрос заголовок о bash:

w1=false
while read line ;do
    if [ "$line" ] ;then
        if $w1 && [ -z "${line//*words*}" ] ;then
            echo $line
            break
        fi
        if [ -z "${line//*special*}" ] ;then w1=true ;fi
    fi
done <file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...