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

标签 bash function for-loop sed while-loop

我正在使用 sed 为文件中的特定字段替换随机的 10 位数字字符串,我可以成功地做到这一点。但是,sed 执行的每个替换都使用相同的随机 10 位数字字符串,这在这种情况下是 Not Acceptable 。对于 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() 函数,但显然它被调用一次并且值被重复存储和使用。无论如何要避免这种情况?非常感谢任何帮助!

最佳答案

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

关于bash - 需要为 "While Loop"中使用的每个 Sed 替换生成新的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37420532/

相关文章:

c# - 这个嵌套循环如何输出一个分为 3 个部分的列表,每个部分有 3 个单词?

c - 用 C 打印素数

linux - 通过shell脚本更改文本文件中的路径地址

基于 JavaScript 文本的宠物游戏

linux - While 循环在 1 次迭代后停止 [BASH]

javascript - 如何让greasemonkey运行特定的javascript : function?

arrays - MATLAB - 避免元胞数组内向量中的重复值并取下一个

c# - 检测到无法访问的代码,if 语句中的变量

bash printf : how to understand zero dot s ("%0.s") syntax

bash - 在 awk 中设置 FNR 值