2017-03-03 60 views
1
grep -Hrl DataLogger /testFolder/ | xargs sed /,$/{N -e"s|DataLogger::copyStringLength(\(dl.[a-zA-Z0-9]\+\)..\(.\+\)(.c_str()\)\+\(,\s*.*;)|IDataLogger::copyString(\2, \1);|g"} 

我正在使用上述腳本將方法調用從DataLogger::copyStringLength(dest, source, length)更改爲IDataLogger::copyString(source, dest)sed未打印到位

上面的腳本總體上看起來像我想要的那樣,並且正在替換方法而不管方法調用中的換行符。但就目前而言,我只是在控制檯上打印,而不是在文件中就地打印。我已經嘗試在sed調用中的幾個地方放置-i選項,並且它總是返回一個錯誤。

任何反饋將不勝感激。

對於那些好奇,爲什麼和在那裏換行顯示,有3種不同的格式,這種方法(根據變量名的長度)

copyStringLength(varA, varB, varC); 

copyStringLength(varA, varB, 
       varC); 

copyStringLength(varA, 
       varB, 
       varC); 
+0

你在OS X上做這個嗎? – Barmar

+0

如果您是,請參閱http://stackoverflow.com/questions/4247068/sed-command-with-i-option-failing-on-mac-but-works-on-linux/4247319#4247319和http:// stackoverflow.com/questions/7573368/in-place-edits-with-sed-on-os-x/7573438#7573438 – Barmar

+0

我們在RHEL6上運行。雖然看第一個問題,如果有辦法壓制備份文件,那會很好。沒有必要,但可以節省我幾次查找/刪除。 –

回答

0

我怎麼沒看到你的sed命令可以按照你的問題的方式工作(也許這是從原始腳本複製的錯誤)。

不管怎樣,從你的代碼,我可以得到兩個假設:

  • 參數不能containng ,(字符串,調用的函數等)
  • 函數調用最多不超過3線劃分。

這就是說,命令行是:

grep -rl DataLogger /testFolder/ | xargs sed -i \ 
    -e '/,\s*$/N;/,\s*$/N' \ 
    -e 's/\(DataLogger::copyString\)Length(\s*\([^,]\+\)\s*,\s*\([^,]\+\)\s*,.*);/I\1(\3, \2);/g' 

說明

  • 在grep的-H-l是等價的與-r(遞歸)選項(打印文件名) 。
  • -i編輯代替文件(沒有備份)
  • 第一-e加入與,結束與下一個的(忽略尾部空格)
  • 第二-e使第一的開關的前兩行兩個參數,不包括第三個參數和它們之間的任何空格。

它會工作,假設文件名中沒有空格,否則sed將失敗。