1

次のファイルがあります。

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 が追加されていることを確認する方法はわかりません。

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 に答える