需要SED或AWK脚本来进行strlen优化

Jay*_*012 3 regex awk sed

我只需要一点帮助,因为我很少接触sed或awk.我正在尝试更换

String1.append("Hello");   // regexp to find this is: \w*\.append\(".*"\) 
Run Code Online (Sandbox Code Playgroud)

String1.append("Hello", 5);  // note it has to figure out the length of "Hello"
Run Code Online (Sandbox Code Playgroud)

我需要进行搜索并替换成千上万的文件.并且"Hello可以是任何东西......包括"\n \n \n",它应该是3而不是6.示例:

s.append("\n\n\n");  ---> s.append("\n\n\n", 3);
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助...我想我需要awk这样做,所以我正在阅读关于awk基础知识的教程...

Ed *_*ton 5

由于您希望在包含代码的某些文件上运行此功能,因此以下是该完整功能的示例:

$ cat file
foo() {
   String1.append("Hello");
   if (bar) {
      s.append("\n\n\n");
   }
   else {
      s.append("\n\\n\n\\\n");
   }
}
$
$ cat tst.awk
match($0,/[[:alnum:]_]+\.append\(".*"\)/) {
    split(substr($0,RSTART,RLENGTH), orig, /"/)

    head = substr($0,1,RSTART-1) orig[1]
    tail = orig[3] substr($0,RSTART+RLENGTH)

    tgt = orig[2]
    gsub(/[\\][\\]/,"X",tgt)
    gsub(/[\\]/,"",tgt)

    $0 = sprintf("%s\"%s\", %d%s", head, orig[2], length(tgt), tail)
}
{ print }
$
$ awk -f tst.awk file
foo() {
   String1.append("Hello", 5);
   if (bar) {
      s.append("\n\n\n", 3);
   }
   else {
      s.append("\n\\n\n\\\n", 6);
   }
}
Run Code Online (Sandbox Code Playgroud)

我将原始发布问题中的示例中的"\ w"替换为POSIX等效"[[:alnum:] _]"以便于移植."\ w"将与GNU awk和其他一些工具一起使用,但不是所有工具而不是所有工具.