簡體   English   中英

bash 返回兩個模式之間的字符串

[英]bash return string between 2 patterns

我有這個文件: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

路由器.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

你的例子不清楚,但這是你想要做的嗎?

$ 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
$ 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

這可能對你有用(GNU sed):

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

將文件名存儲在保留空間中並附加修訂,然后用空格替換引入的換行符並打印結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM