【问题标题】:Find and Replace for Complex String查找和替换复杂字符串
【发布时间】:2016-01-04 12:06:25
【问题描述】:

我有一个包含类似句子的输入文件

typedef void * __builtin_va_list;

我想把它替换为

typedef void ** __builtin_va_list;

我尝试如下使用 sed

sed 's/void * __builtin_va_list/void ** __builtin_va_list/g' FILE.txt

但它不起作用。我认为这是由于*的参与表达。我们该如何处理这种情况?

【问题讨论】:

    标签: shell replace sed


    【解决方案1】:

    您可以将此搜索/替换用于捕获的组和反向引用:

    sed -r 's/(void \*)( __builtin_va_list)/\1*\2/g' file
    typedef void ** __builtin_va_list;
    

    还请记住,* 需要转义,因为它是特殊的正则表达式元字符。

    【讨论】:

    • 我认为您是在指示将单个 * 替换为 2 个 *。我说的对吗?
    • 是的,这是正确的>我在第一个捕获组中已经有一个*,这就是为什么在\1之后再添加一个
    • 对于这种简单的情况,捕获组可能有点矫枉过正,但无论如何都值得了解。只需转义 * 就足够了:sed 's/typedef void \*/&*/'
    • @A.Danischewski: 是的,但它会匹配输入字符串中* 之后的所有内容。对 OP 来说可能没问题,但有区别。
    【解决方案2】:

    你需要逃离群星:

    sed 's/void \* __builtin_va_list/void \*\* __builtin_va_list/g' FILE.txt
    

    【讨论】:

    • 替换中无需转义。