我正在尝试使用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>
但是我不知道如何只为每个匹配替换字符的子类。我不知道每个标签中有多少个+。 我想我应该为第一个正则表达式的所有匹配项运行一个正则表达式,但是我不确定如何做到这一点。
(换句话说,我想匹配所有+,但只能匹配特定的尖括号标记)。
有人暗示吗?
非常感谢, 丹妮尔
答案 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