我们可以在另一个awk命令中运行awk / sed命令吗?

时间:2015-10-13 19:19:36

标签: regex bash awk sed

我有以下字符串:



<T"4567">Dummy Data</Test>
<T"0023"><Tag1>Dummy</Tag1></Test>
>DummyData<T"0001"><Tag2>asdad</Tag2><Tag3>bla</Tag3><Tag4>Dummy Data</Tag4></Test>
RandomString<T"0014">Dummy2 </Test>
&#13;
&#13;
&#13;

我使用以下命令从一个大文件中过滤掉了这个字符串:

 awk '{for(tag=1;tag<=NF;tag++){if($tag~/"...."/){print $tag}}}' Big_FILE

<T"dddd">格式检索所有行。

现在,我想将所有结束</Test>标记与起始<T"dddd">标记中的值匹配。 请注意,我们每行都有一对。 我可以为awk使用其他$tag吗?我想解析所有行并将值存储在<T"">分隔符之间。对于每一行,我还想使用此值覆盖sed配对的</Test>标记。

最后,它应该是这样的:

&#13;
&#13;
<T4567>Dummy Data</T4567>
<T0023><Tag1>Dummy</Tag1></T0023>
>DummyData<T0001><Tag2>asdad</Tag2><Tag3>bla</Tag3><Tag4>Dummy Data</Tag4></T0001>
RandomString<T0014>Dummy2 </T0014>
&#13;
&#13;
&#13;

我在考虑使用这样的东西:

awk '{for(tag=1;tag<=NF;tag++){if($tag~/"...."/)
                  {print $tag
                   awk -v '[<T" ">]' '{print $tag_new}' $tag
                   sed -i -e 's/</Test>/</T$tag_new>/g' $tag
                   sed -i -e 's/<T"/<T/g' $tag
                   sed -i -e 's/">/>/g' $tag
                   }}}

但是你可以看到我不熟悉awksed。有没有推荐的方法来做这个复杂的(对我来说)过滤和替换过程?

谢谢!

2 个答案:

答案 0 :(得分:1)

从不鼓励从awk或perl调用awk或sed或perl。

在这种情况下,您只需要:

perl -pe 's{<T"(\d+)">(.*?)</Test>}{<T$1>$2</T$1>}g' file
制造

<T4567>Dummy Data</T4567>
<T0023><Tag1>Dummy</Tag1></T0023>
>DummyData<T0001><Tag2>asdad</Tag2><Tag3>bla</Tag3><Tag4>Dummy Data</Tag4></T0001>
RandomString<T0014>Dummy2 </T0014>

答案 1 :(得分:0)

如果数据没有双引号,问题行除外,您可以使用sed:

while IFS=\" read -r f1 f2 f3; do
        echo "${f1}${f2}$(echo "${f3}" |sed 's#</Test>#</T'${f2}'>#')"
done < Big_FILE