shellscript:在匹配的字符串之间添加(upcounting)数值

时间:2017-12-12 13:54:43

标签: linux bash shell awk sed

我有超过100个文件,超过9000行文字。其中一个文件的预览摘录如下所示:

<productname>kidscar1</productname>
<productid>98</productid>
<productname>kidscar2</productname>
<productcolor>yellow</productcolor>
<productid>101</productid>
<productname>kidscar3</productname>
<productsize>xxl</productsize>
<productcolor>green</productcolor>
<productid>104</productid>
<productname>kidscar4</productname>
<productcolor>bleu</productcolor>
<productsize>xl</productsize>
<producttype>electric</producttype>
<productid>103</productid>

我尝试从不同的产品ID开始更改(重新安排)产品ID,并自动对包含产品ID的下一行进行计数。

我在考虑一个shell脚本解决方案,我可以在for循环中使用它。

**sh idscript.sh oldfile.txt 1000 productid > newfile.txt**

结果:

<productname>kidscar1</productname>
<productid>1000</productid>
<productname>kidscar2</productname>
<productcolor>yellow</productcolor>
<productid>1001</productid>
<productname>kidscar3</productname>
<productsize>xxl</productsize>
<productcolor>green</productcolor>
<productid>1002</productid>
<productname>kidscar4</productname>
<productcolor>bleu</productcolor>
<productsize>xl</productsize>
<producttype>electric</producttype>
<productid>1003</productid>`

我知道可以使用下一个命令替换sed中的整行:

**sed "s/<productid>100</productid>=.*/<productid>=<productid>1000</productid>/g"**

但是我怎样才能使这项工作得到上述结果呢?如果有其他(更简单)的方法来实现这一点,我也喜欢听到它!

2 个答案:

答案 0 :(得分:2)

sed是s / old / new就是全部。在这种情况下,您需要一个数字变量来跟踪增量产品,而sed根本不支持变量,所以只需使用awk:

$ awk -v pid=1000 '/<productid>/{sub(/[0-9]+/,pid++)}1' file
<productname>kidscar1</productname>
<productid>1000</productid>
<productname>kidscar2</productname>
<productcolor>yellow</productcolor>
<productid>1001</productid>
<productname>kidscar3</productname>
<productsize>xxl</productsize>
<productcolor>green</productcolor>
<productid>1002</productid>
<productname>kidscar4</productname>
<productcolor>bleu</productcolor>
<productsize>xl</productsize>
<producttype>electric</producttype>
<productid>1003</productid>

答案 1 :(得分:0)

关注awk也可以帮助您。

awk -v val=1000 '/productid/{sub(/>[0-9]+</,">"val++"<")} 1'  Input_file