如果最終「>」在你的例子是最後的「>」在每一行,然後這應該工作:
find root -name '*.cpp' -print0 |
xargs -0 sed -i 's/\((std::vector<.*>\)\([^>]*$\)/\1 const\&\2/'
儘量sed的一個單一的文件,並沒有-i第一,如:
$ cat file
(std::vector<int>
(std::vector<int> foo
(std::vector<std::map<std::string, int>>
(std::vector<std::map<std::string, int>> bar
$ sed 's/\((std::vector<.*>\)\([^>]*$\)/\1 const\&\2/' file
(std::vector<int> const&
(std::vector<int> const& foo
(std::vector<std::map<std::string, int>> const&
(std::vector<std::map<std::string, int>> const& bar
如果在你的例子中的最後一個之後可以有「>」,那麼解決方案非平凡,發佈一些有代表性的樣本輸入和期望的輸出。
哦,究竟發生了什麼,這裏是不平凡的腳本:
$ cat file
(std::vector<int>
(std::vector<int> foo
(std::vector<int> with extra > in text
(std::vector<std::map<std::string, int>>
(std::vector<std::map<std::string, int>> bar
(std::vector<std::map<std::string, int>> and here is > again
$ awk -v FS= -v str="(std::vector<" '
BEGIN{ lgth=length(str) }
start=index($0,str) {
cnt = 1
for(i=(start+lgth);(i<=NF) && (cnt!=0);i++) {
if ($i == "<") cnt++
if ($i == ">") cnt--
}
$0 = substr($0,1,i-1) " const&" substr($0,i)
}1' file
(std::vector<int> const&
(std::vector<int> const& foo
(std::vector<int> const& with extra > in text
(std::vector<std::map<std::string, int>> const&
(std::vector<std::map<std::string, int>> const& bar
(std::vector<std::map<std::string, int>> const& and here is > again
做一個while循環中:
find root -name '*.cpp' -print |
while IFS= read -r file; do
awk -v FS= -v str="(std::vector<" '
BEGIN{ lgth=length(str) }
start=index($0,str) {
cnt = 1
for(i=(start+lgth);(i<=NF) && (cnt!=0);i++) {
if ($i == "<") cnt++
if ($i == ">") cnt--
}
$0 = substr($0,1,i-1) " const&" substr($0,i)
}1' "$file" > tmp &&
mv tmp "$file"
done
如果你的文件名中包含換行符這不會工作,但無論如何,你應該修正這些問題。
[你有什麼試過?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – 2013-03-04 09:51:13