1

我有一个这样的文件。abc.txt

<ra><r>12.34</r><e>235</e><a>34.908</a><r>23</r><a>234.09</a><p>234</p><a>23</a></ra>
<hello>sadfaf</hello>
<hi>hiisadf</hi>
<ra><s>asdf</s><qw>345</qw><a>345</a><po>234</po><a>345</a></ra>

我要做的是我必须找到<ra>标签,对于内部<ra>标签,有一个<a>标签,我必须用 0.00 替换它的值。

grep "<ra>" "abc.txt" | grep "<a>"

我能找到,但我不知道如何改变。

为此的输出文件:-

<ra><r>12.34</r><e>235</e><a>0.00</a><r>23</r><a>0.00</a><p>234</p><a>0.00</a></ra>
<hello>sadfaf</hello>
<hi>hiisadf</hi>
<ra><s>asdf</s><qw>345</qw><a>0.00</a><po>234</po><a>0.00</a></ra>
4

3 回答 3

3

awk使用和替换gsub

awk '/^<ra>/ {gsub(/<a>[^<]*</,"<a>0.00<")}1' file
<ra><r>12.34</r><e>235</e><a>0.00</a><r>23</r><a>0.00</a><p>234</p><a>0.00</a></ra>
<hello>sadfaf</hello>
<hi>hiisadf</hi>
<ra><s>asdf</s><qw>345</qw><a>0.00</a><po>234</po><a>0.00</a></ra>
于 2013-09-26T11:24:50.433 回答
2

您可以尝试使用以下代码:

$ sed -e '/<ra>/ s#<a>[^<]*<#<a>0.00<#g' file
<ra><r>12.34</r><e>235</e><a>0.00</a><r>23</r><a>0.00</a><p>234</p><a>0.00</a></ra>
<hello>sadfaf</hello>
<hi>hiisadf</hi>
<ra><s>asdf</s><qw>345</qw><a>0.00</a><po>234</po><a>0.00</a></ra>

它基于这样的结构:

Print # in lines starting with BBB just if there was not ^# before
sed -e '/^BBB/ s/^#*/#/' -i file

将分隔符更改为 a#所以我们不需要转义/in </a>

请注意,如果您想要更新文件,您需要添加-i到 sed ( sed -i -e ...)。否则结果将打印在标准输出中。

于 2013-09-26T11:04:14.217 回答
2

这个 sed 应该工作:

sed -i.bak '/<ra>/s~\(<a>\)[^<]*\(</a>\)~\10.00\2~g' abc.txt
<ra><r>12.34</r><e>235</e><a>0.00</a><r>23</r><a>0.00</a><p>234</p><a>0.00</a></ra>
<hello>sadfaf</hello>
<hi>hiisadf</hi>
<ra><s>asdf</s><qw>345</qw><a>0.00</a><po>234</po><a>0.00</a></ra>

由于-i(内联)开关,此 sed 将保存原始文件本身的更改。

于 2013-09-26T11:04:24.540 回答