我想遞歸地將一個篩選器(例如sed -e 's/OLD/NEW/g'
)應用於svn屬性值。通過篩選器命令編輯svn屬性
首先,對一個目標,我可以做下列之一:
svn propget --strict PROPNAME TARGET | sed -e 's/OLD/NEW/g' | svn propset PROPNAME --file=- TARGET
svn propset PROPNAME --file=<(svn propget --strict PROPNAME TARGET | sed -e 's/OLD/NEW/g') TARGET
SVN_EDITOR="sed -i -e 's/OLD/NEW/g'" svn propedit PROPNAME TARGET
svn propedit --editor-cmd "sed -i -e 's/OLD/NEW/g'" PROPNAME TARGET
哪一個會bes T'
我不喜歡關於1或2的是,即使svn propget ... | sed ...
管道失敗,仍然執行svn propset
,可能在一個空的stdin上重置屬性。
在另一方面,我不喜歡約3或4是整個過濾命令行應該被引用並製成一個串,這有時使得報價和參數擴展棘手。並注意選項-i
- 過濾命令應該採取一個文件參數和到位,這意味着這些方法不能適用於不提供這種就地編輯功能的命令,如tr
甚至awk
編輯。
有沒有更好的選擇,或者其中的一種可能的改進?
第二個,我該如何遞歸地做 - 即在給定TARGET下每個具有指定屬性PROPNAME的目標上?我不能只添加-R
到svn propget
,因爲它會將所有內容拼接成一個文本流,並且svn propedit
甚至沒有-R
。看來,我必須做一些事情,如:
svn proplist -R --only-with PROPNAME TARGET | while read target
do
# do one of the above on "$target"
done
但svn proplist
沒有這樣的東西叫做--only-with
,我不能簡單地分析其產量和搶只有具有財產這些目標的名字。
有什麼好的方法可以做到嗎?