需要为"While Loop"中使用的每个 sed 替换生成新的随机数



我正在使用 sed 为文件中的某个字段替换随机的 10 位数字字符串,我可以成功地做到这一点。 但是,sed 执行的每个替换都使用相同的随机 10 位数字字符串,这在这种情况下是不可接受的。 我需要一个新的随机 10 位数字字符串,用于 sed 执行的每个替换。 这是我到目前为止所拥有的:

#!/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() 函数,但显然它被调用一次并且值被反复存储和使用。 有没有办法避免这种情况? 任何帮助将不胜感激!

只需使用 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

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

相关内容

  • 没有找到相关文章

最新更新