【问题标题】:Search and delete a block using sed command in ubuntu在 ubuntu 中使用 sed 命令搜索和删除块
【发布时间】:2012-09-14 00:06:54
【问题描述】:

我想要执行的操作是 1- 查找和 2- 删除 (__c64) 的整个定义块:

unsigned long long __c64(unsigned int llvm_cbe_hi, unsigned int llvm_cbe_lo) {
unsigned long long llvm_cbe_retval;    /* Address-exposed local */
unsigned long long llvm_cbe_retval1;



  *(&llvm_cbe_retval) = (((((unsigned long long )(unsigned int )llvm_cbe_hi)) << 32ul) |  (((unsigned          long long )(unsigned int )llvm_cbe_lo)));
  llvm_cbe_retval1 = *(&llvm_cbe_retval);
  return llvm_cbe_retval1;
}

在一个项目中除了一个 .c 文件之外的所有文件。由于在 .o 到可执行文件的编译阶段,我收到错误“__c64 的多重定义”,我想删除除一个之外的所有这些以解决问题。

有什么想法吗?

问候,

阿米尔

【问题讨论】:

    标签: bash vim sed vi replace


    【解决方案1】:

    如果所有文件中的函数布局完全相同,你可以试试这个

    gvim -p *.c    // Open all relevant files in multiple tabs
    

    然后执行这个

    :bufdo %s/unsigned long long __c64\(.\+\n\)\+\(\n\)\+\(.\+\n\)\+}// | update
    

    最后执行的“更新”将保存每个文件。

    【讨论】:

    • 感谢您的回复,难道我们没有像“sed -i s/”这样的 bash 脚本可以放在编译阶段的中间以便自动完成吗?
    • :顺便说一句,是删除前3行还是全部6行块??因为我只能看到三个\n\?
    • 这就是'+'的用途。它将删除以右大括号结尾的整个块。
    • 谢谢我明白了。但为什么我不能在 bash 中使用这个脚本和 sed 类似: sed -i 's/unsigned long long __c64(.\+\n)\+(\n)\+(.\+\n)\+} //' "$f" .它不会改变任何东西:|
    • 因为我检查它必须与 sed 逐行读取的差异,所以我想我需要另一个命令来执行任务,对吧?
    【解决方案2】:

    伙计们,我发现定义是动态变化的,我试图找出类似的东西:

    sed '/^unsigned long long __c64/,/}/d'
    

    幸运的是,它确实奏效了。

    感谢所有帮助。

    阿米尔

    【讨论】:

      猜你喜欢
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 2018-05-23
      • 2011-03-21
      • 2015-10-14
      • 1970-01-01
      • 2017-09-26
      相关资源
      最近更新 更多