for 루프에서 sed 및 변수 사용

for 루프에서 sed 및 변수 사용

나는 다음을 가지고 있습니다 :

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 }

정규식 문자가 포함된 경우에도 해당 값의 모든 항목이 strstring 으로 대체됩니다.ANONstr

파일에서 문자열을 읽으려면(추가적인 이점은 탭으로 구분된 문자열 파일의 두 번째 열에 대체할 문자열이 포함되어 있다는 것입니다):

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

관련 정보