我们可以在另一个awk命令中运行awk/sed命令吗?
问题描述:
我有以下字符串:我们可以在另一个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
}}}
但你可以看到我我不熟悉awk
和sed
。有没有建议的方式来做这个复杂的(对我来说)过滤和替换过程?
谢谢!
答
不鼓励从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>
答
当数据不除问题线双引号,你可以使用SED:
while IFS=\" read -r f1 f2 f3; do
echo "${f1}${f2}$(echo "${f3}" |sed 's#</Test>#</T'${f2}'>#')"
done < Big_FILE
谢谢!非常有用的命令! – vldkrm