Как получить строку, которая находится после шаблона в bash - PullRequest
0 голосов
/ 30 января 2020

У меня большой файл. Я хочу получить слово, которое находится точно после этой строки: «PatterStr ()».

Две строки образца:

PatterStr().123232424 hhhhh 9999.  test, test32312
66666666698977.         PatterStr().8888

Выходные данные должны быть:

123232424
8888

, когда я использую grep, будет напечатана вся строка И когда два шаблона найдены в строка, обе должны быть напечатаны, например:

PatterStr().123232424 hhhhh 9999.  test, test32312.  PatterStr().11111111
66666666698977.         PatterStr().8888

правильный результат:

123232424
11111111
8888

Ответы [ 5 ]

5 голосов
/ 30 января 2020

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

awk '
{
  while(match($0,/PatterStr\(\)\.[0-9]+/)){
    value=substr($0,RSTART,RLENGTH)
    sub(/.*\./,"",value)
    print value
    $0=substr($0,RSTART+RLENGTH)
    value=""
  }
}'  Input_file

Вывод будет следующим:

123232424
11111111
8888

Объяснение вышеприведенного кода: Добавление подробного уровня объяснения для кода выше.

awk '                                              ##Starting awk program from here.
{
  while(match($0,/PatterStr\(\)\.[0-9]+/)){        ##Starting while loop which has match function to match regex of PatterStr(). till all digits here.
    value=substr($0,RSTART,RLENGTH)                ##Creating variable value which has sub-string value of current line, startin point RSTART tioll RLENGTH.
    sub(/.*\./,"",value)                           ##Substituting everything till DOT with NULL in variable value here.
    print value                                    ##Printing variable value here.
    $0=substr($0,RSTART+RLENGTH)                   ##Setting rest of sub-string value starting from RSTART+RLENGTH to last of line of current line here.
    value=""                                       ##Nullify variable value here.
  }
}'  Input_file                                     ##Mentioning Input_file name here.
3 голосов
/ 30 января 2020

Вы можете уменьшить вывод grep с помощью опции -o или - только для сопоставления . Это напечатает только соответствующие части совпадающей линии. Чтобы подавить вывод PatterStr () , вы можете использовать LookBehind , как описано здесь .

cat bigfile | grep -Po '(?<=PatterStr\(\)\.)[\w]+'
0 голосов
/ 03 февраля 2020

С помощью ORS мы получаем «\ n» после каждого оператора в каждой строке.

awk -F'[. ]' 'NR == 1{print $2 ORS $NF}NR == 2{print $NF}' file

123232424
11111111
8888
0 голосов
/ 30 января 2020

Есть много способов, как вы можете достичь этого, например, вы можете сделать это с помощью sed:

sed 's/ /\n/g' text-file.txt | sed -n 's/^PatterStr()\.\(.*\)/\1/p'

Первый sed разделит содержимое на отдельные строки, заменив пробел новой строкой, второй будет соответствовать линии с PatterStr (). и распечатайте то, что идет сразу после него.

0 голосов
/ 30 января 2020

Эта строка делает то, что вам нужно

grep 'PatterStr()' large-file | sed "s/ /\n/g" | grep 'PatterStr()' | cut -f2 -d\.

Вывод:

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