我想sed -e 's/OLD/NEW/g'
递归地对 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
哪一个是最好的?
我不喜欢 1 或 2 的是,即使svn propget ... | sed ...
管道失败,svn propset
仍会执行,可能在空的标准输入上,重置属性。
另一方面,我不喜欢 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
,我不能轻易地解析它的输出并只获取那些具有该属性的目标的名称。
有什么好的方法吗?