나는 다음을 가지고 있습니다 :
for i in "${arr[@]}"
do
sed -r "s/$i/ANON/g" /log > /test.txt
done
하지만 변수 i가 작동하지 않습니다.
답변1
루프에 리디렉션을 포함하면 test.txt
각 반복마다 덮어쓰게 됩니다. 루프를 사용하여 스크립트를 생성 sed
하고 이를 사용하여 파일을 한 번만 처리할 수 있습니다.
for i in "${arr[@]}" ; do
printf 's/%s/ANON/g\n' "$i"
done | sed -r -f- /log > /test.txt
또는 간단하게:
printf 's/%s/ANON/g\n' "${arr[@]}" | sed -r -f- /log > /test.txt
배열에 sed에서 특별한 의미를 갖는 문자가 포함되어 있으면 여전히 손상될 수 있습니다(배열의 내용을 완전히 제어할 수 없는 경우 명령 주입 취약점에 해당할 수도 있음).
답변2
arr
배열에 있는 모든 단어를 word 로 바꾸고 싶다고 가정합니다 ANON
.
코드는 제대로 작동하지만 루프가 반복될 때마다 출력 파일을 덮어쓰게 됩니다. 즉, 최종 파일은 배열의 마지막 단어만 대체합니다.
단어에 정규식 문자(예: 및 )로 해석될 수 있는 문자가 포함된 경우에도 *
잠재적인 문제가 있습니다 .[
모든 교체에 대해 정확한 문자열 비교를 수행하는 것이 더 안전합니다. 다음과 같은 방법으로 이 작업을 수행할 수 있습니다 awk
.
{
while (offset = index($0, str))
$0 = substr($0, 1, offset - 1) "ANON" substr($0, offset + length(str))
}
{ print }
정규식 문자가 포함된 경우에도 해당 값의 모든 항목이 str
string 으로 대체됩니다.ANON
str
파일에서 문자열을 읽으려면(추가적인 이점은 탭으로 구분된 문자열 파일의 두 번째 열에 대체할 문자열이 포함되어 있다는 것입니다):
BEGIN { FS = "\t" }
NR == FNR { str[$1] = $2; next }
{
for (s in str) {
sl = length(s)
while (offset = index($0, s))
$0 = substr($0, 1, offset - 1) str[s] substr($0, offset + sl)
}
}
{ print }
탭으로 구분된 문자열 파일을 strings
다음과 같이 지정합니다.
*password* *redacted*
My Name Not really my name
...텍스트 파일 file.txt
은 다음과 같습니다.
Password for the account belonging to My Name: *password*
... awk 코드가 생성됩니다
Password for the account belonging to Not really my name: *redacted*
다음과 같이 실행할 때
awk -f script.awk strings file.txt