替换grep匹配中多次出现的字符

时间:2018-10-04 23:04:02

标签: regex grep textwrangler

我正在尝试使用TextWrangler来获取一堆文本文件,匹配某些尖括号标记中的所有内容(到目前为止非常好),并且对于每次匹配,都替换所有出现的特定与另一个角色。

例如,我想采取类似的方法

xx+xx <f>bar+bar+fo+bar+fe</f> yy+y <f>fee+bar</f> zz

匹配<f></f>中的所有内容,然后将所有+替换为*(但只能在“ f”标记内)。

xx+xx <f>bar*bar*fo*bar*fe</f> yy+y <f>fee*bar</f> zz

我认为我可以轻松地将包含+的“ f”标签与类似这样的表达式匹配

<f>[^<]*\+[^<]*</f>

但是我不知道如何只为每个匹配替换字符的子类。我不知道每个标签中有多少个+。 我想我应该为第一个正则表达式的所有匹配项运行一个正则表达式,但是我不确定如何做到这一点。

(换句话说,我想匹配所有+,但只能匹配特定的尖括号标记)。

有人暗示吗?

非常感谢, 丹妮尔

1 个答案:

答案 0 :(得分:0)

如果您对awk解决方案没问题:

$ awk '{
    while ( match($0,/<f>[^<]*\+[^<]*<\/f>/) ) {
        tgt = substr($0,RSTART,RLENGTH)
        gsub(/\+/,"*",tgt)
        $0 = substr($0,1,RSTART-1) tgt substr($0,RSTART+RLENGTH)
    }
    print
}' file
xx+xx <f>bar*bar*fo*bar*fe</f> yy+y <f>fee*bar</f> zz

以上内容可在任何UNIX盒上的任何shell中使用任何awk进行工作。如示例代码所示,它依赖于每个<中没有<f>...</f>。如果可以的话,请在您的示例中添加该代码,然后我们可以调整脚本来对其进行处理:

$ awk '{
    gsub("</f>",RS)
    while ( match($0,/<f>[^\n]*\+[^\n]*\n/) ) {
        tgt = substr($0,RSTART,RLENGTH)
        gsub(/\+/,"*",tgt)
        $0 = substr($0,1,RSTART-1) tgt substr($0,RSTART+RLENGTH)
    }
    gsub(RS,"</f>")
    print
}' file
xx+xx <f>bar*bar*fo*bar*fe</f> yy+y <f>fee*bar</f> zz