alt*_*ate 5 bash for-loop sed function while-loop
我正在使用 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
Run Code Online (Sandbox Code Playgroud)
以下是原始 FITIDTEST.QFX 文件的示例:
<FITID>1266821191
<FITID>1267832241
<FITID>1268070393
<FITID>1268565193
<FITID>1268882385
<FITID>1268882384
Run Code Online (Sandbox Code Playgroud)
这是执行脚本后的输出:
<FITID>4270240286
<FITID>4270240286
<FITID>4270240286
<FITID>4270240286
<FITID>4270240286
<FITID>4270240286
Run Code Online (Sandbox Code Playgroud)
我需要每个字段的 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_
Run Code Online (Sandbox Code Playgroud)
输出:
cat _tmp_
<FITID>9974823224
<FITID>1524680591
<FITID>7433495381
<FITID>6642730759
<FITID>9653629434
<FITID>1325816974
Run Code Online (Sandbox Code Playgroud)