我有以下字符串:
<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;
我使用以下命令从一个大文件中过滤掉了这个字符串:
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>
&#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
}}}
但是你可以看到我不熟悉awk
和sed
。有没有推荐的方法来做这个复杂的(对我来说)过滤和替换过程?
谢谢!
答案 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