2011-10-21 88 views
2

我試圖通過bash腳本提交git修補程序。這不是一個混帳問題!這是我想要做的,我有一個目錄中的文件列表。我想要逐個讀取這些文件,並從中提取特定的行,然後進行提交。 這是我到目前爲止;使用egrep正則表達式來捕獲部分行

 
patches=/{location}/*.patch 
for patch in $patches 
do 
    echo "Processing $patch file..." 
    git apply $patch 
    git add --all 
    git commit -m | egrep -o "(^Subject: \[PATCH [0-9]\/[0-9]\].)(.*)$" $f 
    echo "Committed $patch file..." 
done 

無法讓egrep正則表達式正常工作以傳遞適當的提交消息。 以下是補丁文件中的示例行;

 
..... 
Subject: [PATCH 1/3] XSR-2756 Including ldap credentials in property file. 
...... 

我只是想捕捉 「XSR-2756包括財產文件LDAP憑證。」並用作git的提交描述。

回答

3

假設你有GNU的grep,使用一個Perl向後看:

git commit -m "$(grep -Po '(?<=Subject: \[PATCH \d/\d\].).*') $patch" 
+0

同意。如果您不使用GNU grep,請使用awk代替'awk'{print gensub(/(^ Subject:\ [PATCH \ d/\ d \]。)(。*)$ /,「\\ 2」,「 g「)}'' – nachito

+0

'awk'{sub(/^Subject:\ [PATCH \ d \/\ d \] ./,」「);打印}''有點簡單。 –

+0

感謝您的回答 – aug70co

1

在這種情況下不要使用-o來egrep(因爲你正在匹配一些你不想打印的東西)。相反,只需匹配整條線並將其「剪切」(或sed,或其他可以修剪線前綴的其他內容)。

此外,您將git commit的輸出管道輸送到egrep,而不是提供的egrep的輸出作爲命令行選項來git的承諾......我想你想要的東西,如:

git commit -m "$(egrep '<your regexp here>' $f | cut -d] -f2-)" 
1

我會用這個sed

git commit -m | sed -r -n 's#^Subject: \[PATCH [0-9]/[0-9]\] ##p;' 
+0

此答案也有效。謝謝。 – aug70co