
[英]How to match only odd occurrences of a character at the end of the line using grep
[英]Substituting multiple occurrences of a character inside a grep match
我正在尝试使用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>
但是我不知道如何用字符的子类替换每个匹配项。 我不知道每个标签中有多少个+。 我想我应该为第一个正则表达式的所有匹配项运行一个正则表达式,但是我不确定如何做到这一点。
(换句话说,我想匹配所有+,但只匹配特定的尖括号标记)。
有人暗示吗?
非常感谢Daniele
万一您可以使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.