不打印到位

时间:2017-03-03 02:19:41

标签: bash sed

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调用中的几个地方放置-i选项,它总是会返回错误。

任何反馈都将不胜感激。

对于那些对于换行的原因和位置感到好奇的人来说,这种方法有3种不同的格式(取决于变量名的长度)

copyStringLength(varA, varB, varC);

copyStringLength(varA, varB,
                 varC);

copyStringLength(varA,
                 varB,
                 varC);

1 个答案:

答案 0 :(得分:0)

我看不出你的sed命令在你的问题中是如何工作的(可能是原始剧本副本中的错误)。

无论如何,从您的代码我可以得到两个假设:

  • 参数不能包含,(字符串,称为函数等)
  • 函数调用最多分为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将失败,它将起作用。