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

Posted

技术标签:

【中文标题】需要为“While Loop”中使用的每个 Sed 替换生成新的随机数【英文标题】:Need To Generate New Random Numbers For Each Sed Substitution Used In "While Loop" 【发布时间】:2016-09-22 01:52:01 【问题描述】:

我正在使用 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() 函数,但显然它被调用一次并且值被存储和重复使用。有没有办法避免这种情况?非常感谢任何帮助!

【问题讨论】:

【参考方案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

【讨论】:

我仍然需要为每个匹配项执行替换,但我只需要用不同的随机 10 位数字替换每个匹配项。您的解决方案似乎只用随机的 10 位数字替换第一个匹配项。 您更新的命令有效,谢谢!因此,如果我理解正确,“Here String”( 之前添加: 告诉 sed 在每一行上执行,这反过来又调用$(random_number) 函数每次生成一个新的随机数? 是的,你总结得很好,这正是它的工作原理。【参考方案2】:

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

【讨论】:

不客气,听起来不错,还请阅读 why-is-using-a-shell-loop-to-process-text-considered-bad-practice 以帮助您识别正确的解决方案 :-)。

以上是关于需要为“While Loop”中使用的每个 Sed 替换生成新的随机数的主要内容,如果未能解决你的问题,请参考以下文章

数据库--循环语句:while loop/end loop

VB中 while .....wend 与 DO while.....loop区别

SQL Server 2008 使用 WHILE LOOP 插入

6.while loop

VBA 中 do while loop 用法

java 初级while loop的错误