2015-10-13 139 views
1

我有以下字符串:我们可以在另一个awk命令中运行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>

我从一个大的文件过滤掉这串用下面的命令:

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

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

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

最后,它应该是这样的:

<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>

我想用这样的:

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。有没有建议的方式来做这个复杂的(对我来说)过滤和替换过程?

谢谢!

回答

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> 
+0

谢谢!非常有用的命令! – vldkrm

0

当数据不除问题线双引号,你可以使用SED:

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