모든 파일에서 "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
코드의 문제는 두 가지입니다.
기본적으로 이
grep
명령은 문자열이 아닌 정규식 패턴을 예상하며 문자열에는 정규식 관련 문자([
및]
)가 포함되어 있습니다. 교체시 동일한 문제가 발생합니다sed
.출력 파일 이름
grep -l
가능한손상될 수 있습니다. 파일에 인쇄할 수 없는 문자(예: 개행 문자)가 포함되어 있으면grep
출력 이름에서 해당 문자를 제거하세요. 이는sed
파일에 대한 호출이 이루어지지 않음을 의미합니다.
이는 파일 이름이 아닌 파일 내용의 문자열을 바꾸려고 한다고 가정합니다.
/mnt/d/power/jan/output
Aux 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"