bash возврат строки между 2 шаблонами - PullRequest
0 голосов
/ 20 января 2020

У меня есть этот файл: 1.txt

===================================================================
File: .cvsignore        Status: Up-to-date

   Working revision:    1.1     Thu Jan 16 11:00:00 2020
   Repository revision: 1.1     /usr/local/rancid/var/CVS/Routers/.cvsignore,v
   Sticky Tag:          (none)
   Sticky Date:         (none)
   Sticky Options:      (none)

===================================================================
File: router.db         Status: Up-to-date

   Working revision:    1.6     Fri Jan 17 11:57:39 2020
   Repository revision: 1.6     /usr/local/rancid/var/CVS/Routers/router.db,v
   Sticky Tag:          (none)
   Sticky Date:         (none)
   Sticky Options:      (none)

===================================================================
File: .cvsignore        Status: Up-to-date

   Working revision:    1.1     Thu Jan 16 11:00:00 2020
   Repository revision: 1.1     /usr/local/rancid/var/CVS/Routers/configs/.cvsignore,v
   Sticky Tag:          (none)
   Sticky Date:         (none)
   Sticky Options:      (none)

===================================================================
===================================================================
File: 1.1.1.1       Status: Up-to-date

   Working revision:    1.2     Fri Jan 17 07:56:21 2020
   Repository revision: 1.2     /usr/local/rancid/var/CVS/Routers/configs/1.1.1.1,v
   Sticky Tag:          (none)
   Sticky Date:         (none)
   Sticky Options:      -ko

Я хочу извлечь строку между File: и Status: (.cvsignore, router.db, 1.1.1.1)

и между Repository revision: и /usr/local/rancid/ (1.1, 1.6, 1.1)

, поэтому окончательный результат должен быть:

.cvsignore 1.1

router.db 1.6

.cvsignore 1.1

1.1.1.1 1.2

для имени файла я создал следующий фильтр:

sed 's/^.*File: //; s/Status:.*$//' 1.txt

Вывод:

===================================================================
.cvsignore       

   Working revision:    1.1     Thu Jan 16 11:00:00 2020
   Repository revision: 1.1     /usr/local/rancid/var/CVS/Routers/.cvsignore,v
   Sticky Tag:          (none)
   Sticky Date:         (none)
   Sticky Options:      (none)

===================================================================
router.db        

   Working revision:    1.6     Fri Jan 17 11:57:39 2020
   Repository revision: 1.6     /usr/local/rancid/var/CVS/Routers/router.db,v
   Sticky Tag:          (none)
   Sticky Date:         (none)
   Sticky Options:      (none)

===================================================================
.cvsignore       

   Working revision:    1.1     Thu Jan 16 11:00:00 2020
   Repository revision: 1.1     /usr/local/rancid/var/CVS/Routers/configs/.cvsignore,v
   Sticky Tag:          (none)
   Sticky Date:         (none)
   Sticky Options:      (none)

===================================================================
1.1.1.1      

   Working revision:    1.2     Fri Jan 17 07:56:21 2020
   Repository revision: 1.2     /usr/local/rancid/var/CVS/Routers/configs/172.18.1.24,v
   Sticky Tag:          (none)
   Sticky Date:         (none)
   Sticky Options:      -ko

===================================================================

Для ревизии репозитория я пытаюсь

sed 's/^.'*Repository revision:' //; s#usr#local#rancid:.*$//' 1.txt

Но получаю

sed: -e expression #1, char 15: unterminated `s' command

Мне нужно одно регулярное выражение для filename и второе для Repository revision

Ответы [ 3 ]

2 голосов
/ 20 января 2020

Ваш пример не ясен, но вы пытаетесь это сделать?

$ awk 'sub(/^[[:space:]]*(File|Repository revision):[[:space:]]*/,""){print $1}' file
.cvsignore
1.1
router.db
1.6
.cvsignore
1.1
1.1.1.1
1.2

или, может быть, это:

$ awk 'sub(/^[[:space:]]*(File|Repository revision):[[:space:]]*/,""){printf "%s%s", $1, ((++c)%2 ? OFS : ORS)}' file
.cvsignore 1.1
router.db 1.6
.cvsignore 1.1
1.1.1.1 1.2
1 голос
/ 20 января 2020

Это может сработать для вас (GNU sed):

sed -En '/^File:\s*(\S+).*/{s//\1/;h};/^\s*Repository revision:\s*(\S+).*/{s//\1/;H;g;s/\n/ /p}' file

Сохраните имя файла в области удержания и добавьте ревизию, затем замените введенную новую строку пробелом и напечатайте результат.

1 голос
/ 20 января 2020
$ awk '/^File:/ { printf "%s # filename ", $2} 
        /Repository revision:/{printf "%s # Repository version\n", $3}' input
.cvsignore # filename 1.1 # Repository version
router.db # filename 1.6 # Repository version
.cvsignore # filename 1.1 # Repository version
1.1.1.1 # filename 1.2 # Repository version
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...