1

我有以下文件:

blue yellow red black yellow
blue red black yellow red black
yellow red red purple yellow

如何将唯一 ID 附加到每个出现的单词red,以便输出类似于:

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。

4

2 回答 2

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
于 2013-08-09T12:51:49.230 回答
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
于 2013-08-09T13:02:06.413 回答