[英]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.