我有以下文件:
blue yellow red black yellow
blue red black yellow red black
yellow red red purple yellow
如何为单词red
的每个匹配项附加唯一ID,以便输出类似于:
blue yellow red1376049638182 black yellow
blue red13760496381928 black yellow red1376049631827 black
yellow red1376049631988 red13760496371827 purple yellow
我尝试了以下命令:
sed "s/red/red$(node -e 'console.log(new Date().getTime())'; sleep 0.001s)/g" file
但很快就意识到ID(在这种情况下是一个时间)只生成一次并在整个文件中全局替换。因此,解决方案必须以某种方式使用循环虽然我不知道如何过滤掉红色的出现并确保每个都附加一个唯一的ID。
答案 0 :(得分:1)
您可以定义一个函数来创建一个随机数。我不是$RANDOM
的忠实粉丝所以我会使用/dev/urandom
创建一个。如果你想要16位数的随机数,你可以说:
function myrandom() {
cat /dev/urandom | tr -dc '[:digit:]' | fold -w 16 | head -1
}
现在使用sed将函数和eval
替换为所需的字符串。请注意,我建议sed
在替换字符串时处理字边界:
sed 's/\bred\b/red$(myrandom)/g' inputfile | while read -r line; do eval echo "${line}"; done
对给定输入的示例调用将导致:
blue yellow red5004720098524945 black yellow
blue red7014391283176465 black yellow red9350810549791982 black
yellow red4276472966991005 red6986710362535116 purple yellow
答案 1 :(得分:0)
另一种方法:
#!/bin/bash
IN=in.txt
OUT=out.txt
KEY="red"
rm -f $OUT
while read LINE
do
QLINE=
NEWQLINE=" $LINE "
echo $QLINE : $NEWQLINE
while [ "$NEWQLINE" != "$QLINE" ]
do
QLINE="$NEWQLINE"
ID=$(uuidgen)
ID=${ID//-/}
NEWQLINE="${QLINE/ $KEY / $KEY$ID }"
done
echo "${QLINE:1:-1}" >> $OUT
done < $IN