여러 파일에서 한 줄 바꾸기

여러 파일에서 한 줄 바꾸기

디렉토리에 일부 텍스트 파일이 있습니다. 그들은 모두 다양한 문자열을 가지고 있지만 하나의 문자열은 모두 동일합니다.

Acct-Session-Id = "XXXXXXXX-XXXXXXXX"

여기서 X - 16진수 형식의 기호입니다.

모든 파일에서 이 ID를 임의의 XXXXXXXX-XXXXXXXX 숫자로 바꿔야 합니다. 번호는 모든 파일에서 동일해야 합니다. 교체 후에는 동일한 이름으로 파일을 저장해야 합니다.

sed로 해보았으나 성공하지 못했습니다...

답변1

이렇게 사용하세요:

id=$(openssl rand -hex 8 | sed 's/./-&/9')
awk -v id=$id '$1 == "Acct-Session-Id"{$3="\042"id"\042"}1' file

산출

Acct-Session-Id = "f7ea78e0-1eeb7b09"

그 다음에:

id=$(openssl rand -hex 8 | sed 's/./-&/9')

while IFS= read -r f; do
    awk -v id=$id '$1 == "Acct-Session-Id"{$3="\042"id"\042"}1' "$f" > /tmp/tmp$$
    mv /tmp/tmp$$ "$f"
done < <(grep -l 'Acct-Session-Id' .)

또 다른 해결책은 다음과 같습니다.(루프와 임시 파일이 필요하지 않음):

export id=$(openssl rand -hex 8 | sed 's/./-&/9')

perl -i -lane '
    $F[2] = "\042$ENV{id}\042" if $F[0] eq "Acct-Session-Id";
    print join " ", @F
' files*

답변2

질문에 태그를 달고 LinuxGNU/Linux를 언급한다고 가정하면 다음과 같은 스크립트를 작성할 수 있습니다.

#! /bin/sh -
IFS= read -r uuid < /proc/sys/kernel/random/uuid || exit
id=${uuid%-*-*}
id=${id%-*}${id##*-}

grep -rl --null -e 'Acct-Session-Id = ".*"' -- "$@" |
  xargs -r0 sed -i -e 's/\(Acct-Session-Id = \)"[^"]*"/\1"'"$id"'"/g' --

다음과 같이 호출됩니다:

path/to/that-script path/to/dir-or-file path/to/other/dir-or-file...

답변3

sed 한 줄

id=$(hexdump -vn8 -e '4/1 "%02x" "-"' /dev/urandom);
sed -ri 's,^Acct-Session-Id = "[[:xdigit:]]{8}-[[:xdigit:]]{8}"$,Acct-Session-Id = "'"${id%?}"'",' ./*.txt;

cat /dev/urandom임의의 바이트를 출력합니다.
hexdump파일의 16진수 보기를 인쇄합니다.
-v= 널 바이트를 억제하지 않습니다.
-n <length>= 처음 n 바이트만(head -c와 동일)
-e 4/1형식 %02x(2자리 숫자)으로 한 줄에 4바이트 x 1을 출력합니다. -
so 값으로 구분하면 id다음과 같아야 합니다 cf41f825-8b1e4c1c-(불행히도 후행 -).

sed -i./*.txt는 모든 파일을 편집
's,^find$,'replace','하고 해당 단어를 검색합니다.'찾다'^줄의 시작 부분에 줄이 있어야 하고, 줄은
단어 바로 뒤에서 끝나야 하며 $(전체 줄과 정확히 일치해야 함),
'replace'변수를 구문 분석하려면 줄을 따옴표로 묶어야 합니다
( "$id"작은 따옴표로 평가되지 않음).

모든 문자열을 일치시키려면 ^제거할 수 있습니다.$

[[:xdigit:]]16진수 사이의 바이트와 일치합니다 0-f(thx @GillesQuenot).
{8}이전 바이트는 연속으로 8번 존재해야 합니다.

${id%?}출력에서 문자열 조작을 사용 하여 후행 와일드카드 $id의 단일 바이트에서 발생하는 경우
%가장 짧은 항목을 제거하므로 ID를 바꾸는 것은 다음과 같습니다.
?
cf41f825-8b1e4c1c


이 예에서는 1. + 3. 행만 요청과 일치하여 변경되며 다른 행은 변경되지 않습니다.

스크린샷

sedline이 정확한 행이고 XXX유효한 16진수 문자열이며 큰따옴표가 포함된 경우 에만 바꾸십시오 "...". 다른 공백이나 다른 문자가 있는 경우 행은 변경되지 않은 상태로 유지됩니다. 단어 Acct-Session-Id는 대소문자를 구분합니다. 파일 이름이 마지막 인수로 전달되고 ./*.txt해당 줄이 대체됩니다.-i

관련 정보