向现有字符串添加唯一ID

时间:2013-08-09 12:17:50

标签: regex bash sed uniqueidentifier

我有以下文件:

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。

2 个答案:

答案 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