我正在使用sed替换文件中某个字段的随机10位数字串,我可以成功地做到这一点。然而,对于每个替换sed执行使用相同的随机10位数字串,这在这种情况下是不可接受的。我需要为每个替换sed执行一个新的随机10位数字串。这是我到目前为止所做的:
#!/bin/bash
#
#
random_number()
{
for i in {1}; do tr -c -d 0-9 < /dev/urandom | head -c 10; done
}
while read line
do
sed -E "s/[<]FITID[>][[:digit:]]+/<FITID>$(random_number)/g"
done<~/Desktop/FITIDTEST.QFX
以下是原始FITIDTEST.QFX文件的示例:
<FITID>1266821191
<FITID>1267832241
<FITID>1268070393
<FITID>1268565193
<FITID>1268882385
<FITID>1268882384
这是执行脚本后的输出:
<FITID>4270240286
<FITID>4270240286
<FITID>4270240286
<FITID>4270240286
<FITID>4270240286
<FITID>4270240286
我需要每个字段的10位数字不同。我认为“while循环”会强制sed每次调用 random_number()函数,但显然它被调用一次并且值被重复存储和使用。反正有没有避免这种情况?非常感谢任何帮助!
答案 0 :(得分:1)
您的sed
正在替换所有匹配模式的行而不仅仅是一行,因此在循环结束时您会看到相同的数字替换。
您可以使用:
while read line; do
sed -E "/<FITID>/s/<FITID>[[:digit:]]+/<FITID>$(random_number)/" <<< "$line"
done < ~/Desktop/FITIDTEST.QFX > _tmp_
<强>输出:强>
cat _tmp_
<FITID>9974823224
<FITID>1524680591
<FITID>7433495381
<FITID>6642730759
<FITID>9653629434
<FITID>1325816974
答案 1 :(得分:1)
只需使用awk:
$ cat tst.awk
BEGIN { srand() }
{
sub(/[0-9]+/,sprintf("%010d",rand()*10000000000))
print
}
$ awk -f tst.awk file
<FITID>3730584119
<FITID>1473036092
<FITID>8390375691
<FITID>6700634479
<FITID>8379256766
<FITID>6583696062
$ awk -f tst.awk file
<FITID>7844627153
<FITID>0141034890
<FITID>9714288799
<FITID>0911892354
<FITID>8916456168
<FITID>4187598430