전체 디렉토리의 문자열을 공백으로 바꿉니다.

전체 디렉토리의 문자열을 공백으로 바꿉니다.

모든 파일에서 "Aux Power [A]"를 "aux_power"로 바꾸고 싶습니다. "Aux Power [A]"가 있는 파일만 수정할 수 있으며 나머지 파일은 변경되지 않습니다.

나는 열심히 노력했다

grep -lR "Aux Power [A]" /mnt/d/power/jan/output | xargs sed -i "s/'Aux Power [A]'/'aux_power_w'/g"

하지만 작동하지 않는 것 같습니다.

조언해주세요.

답변1

코드의 문제는 두 가지입니다.

  1. 기본적으로 이 grep명령은 문자열이 아닌 정규식 패턴을 예상하며 문자열에는 정규식 관련 문자( [])가 포함되어 있습니다. 교체시 동일한 문제가 발생합니다 sed.

  2. 출력 파일 이름grep -l 가능한손상될 수 있습니다. 파일에 인쇄할 수 없는 문자(예: 개행 문자)가 포함되어 있으면 grep출력 이름에서 해당 문자를 제거하세요. 이는 sed파일에 대한 호출이 이루어지지 않음을 의미합니다.


이는 파일 이름이 아닌 파일 내용의 문자열을 바꾸려고 한다고 가정합니다.

/mnt/d/power/jan/outputAux Power [A]사용할 수 있는 정확한 문자열이 포함된 디렉토리 아래의 모든 파일을 찾으려면

find /mnt/d/power/jan/output -type f \
    -exec grep -Fq 'Aux Power [A]' {} ';' -print

문자열을 변경하려면 aux_power다음과 같이 명령을 확장하면 됩니다.

find /mnt/d/power/jan/output -type f \
    -exec grep -Fq 'Aux Power [A]' {} ';' \
    -exec sed -i 's/Aux Power \[A\]/aux_power/g' {} ';'

이는 GNU 를 가정합니다 sed.

출력은 생성 되지 않지만 grep -Fq지정된 문자열(사용되므로 정규 표현식이 아님)을 포함하는 모든 파일에 대해 0 종료 상태가 반환됩니다 -F.

sed명령은 내부 편집(GNU 모드)을 수행하여 문자열의 모든 항목을 변경합니다(여기서는 정규식으로 지정되므로 대괄호가 이스케이프됩니다).

터미널에 나열된 수정된 파일의 이름을 얻으려면 -print에서 이를 수행하십시오 find.-exec grep ... {} ';'


sed여기서 사용하는 표현식은 변경하려는 특정 문자열을 포함하지 않는 파일의 내용을 변경하지 않으므로 명령을 다음과 같이 단축할 수 있습니다 .

find /mnt/d/power/jan/output -type f \
    -exec sed -i 's/Aux Power \[A\]/aux_power/g' {} ';'

이는 다음을 대체합니다.모두디렉토리에 있는 파일 /mnt/d/power/jan/output. 이 문자열을 포함하지 않는 모든 파일은 변경되지 않은 상태로 유지됩니다(하지만 타임스탬프는 계속 업데이트됩니다).

답변2

grep의 대괄호를 피해야 합니다. "[A]"는 "A"와 동일합니다. 노력하다

grep -lR "Aux Power \[A\]" /mnt/d/power/jan/output | xargs sed -i "s/Aux Power \[A\]/aux_power_w/g"

관련 정보