2013-08-09 5 views
1

나는 다음과 같은 파일이 있습니다 출력은 다음과 유사 것을 내가 그렇게 말씀 red의 각 발생에 고유 한 ID를 추가하려면 어떻게기존 문자열에 고유 ID를 덧붙이

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

:

blue yellow red1376049638182 black yellow 
blue red13760496381928 black yellow red1376049631827 black 
yellow red1376049631988 red13760496371827 purple yellow 
을 일의 ID가 (곧

sed "s/red/red$(node -e 'console.log(new Date().getTime())'; sleep 0.001s)/g" file 

하지만 실현 :

나는 다음과 같은 명령을 시도 case a time)은 한 번만 생성되고 전체 파일에서 전역으로 대체됩니다. 따라서 솔루션은 어쨌든 루프를 사용해야합니다. 그러나 어떻게하면 빨간색의 항목을 필터링하고 각 항목에 고유 한 ID가 추가되었는지 확인하지 못할 것입니다.

+0

관련 항목 : http://stackoverflow.com/questions/7835407/how-to-generate-random-number-with-find-and-sed – fedorqui

+0

@fedorqui 그러면 여러 파일에서 한 번만 바뀝니다 (예 : '지느러미를 사용하여 d')하지만 같은 문자열이 여러 번 나오는 단일 파일을 검색하려고합니다. 간단히 말하면, 파일을 순차적으로 검색하여 모든 히트를 멈추고 교체를 시작할 수있는'find'와 동일한 것은 무엇입니까? – mart1n

+0

@fedorqui 관련 파일은 * 동일한 * 임의의 문자열을 파일의 모든 부분으로 대체합니다. – devnull

답변

1

임의의 숫자를 생성하는 함수를 정의 할 수 있습니다. 나는 $RANDOM의 큰 팬이 아니므로 /dev/urandom을 사용하여 하나를 만듭니다. 당신이 16 자리 난수를 원한다면, 당신은 말할 수 :

function myrandom() { 
    cat /dev/urandom | tr -dc '[:digit:]' | fold -w 16 | head -1 
} 

는 이제 기능 나중에 eval를 사용하여 원하는 문자열을 대체하기 위해 sed를 사용합니다. 내가 문자열 교체하는 동안 단어 경계 돌봐 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 
+0

아주 멋지 네요 !! 전에'eval'에 대해 알고 싶었습니다! 고맙습니다! – mart1n

+0

이 접근법에 대해 한 가지 더 질문합니다. 행에';'또는'>'와 같은 특수 문자가 포함되면 어떻게 될까요? 이들을 무시하고'eval'에게 서브 셸 명령 만 실행하도록 지시합니까? – mart1n

+0

아닙니다. 하나의 대안은 원래의 접근법을 반복 당 하나의 대체로 사용하는 것입니다. – devnull

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