디렉토리에 일부 텍스트 파일이 있습니다. 그들은 모두 다양한 문자열을 가지고 있지만 하나의 문자열은 모두 동일합니다.
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
질문에 태그를 달고 Linux
GNU/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. 행만 요청과 일치하여 변경되며 다른 행은 변경되지 않습니다.
sed
line이 정확한 행이고 XXX
유효한 16진수 문자열이며 큰따옴표가 포함된 경우 에만 바꾸십시오 "..."
. 다른 공백이나 다른 문자가 있는 경우 행은 변경되지 않은 상태로 유지됩니다. 단어 Acct-Session-Id
는 대소문자를 구분합니다. 파일 이름이 마지막 인수로 전달되고 ./*.txt
해당 줄이 대체됩니다.-i