파일의 문자열을 재귀적으로 바꾸기

파일의 문자열을 재귀적으로 바꾸기

page_path\example_filename.txt문자열의 백슬래시를 슬래시로 바꾸고 싶습니다 . 또한 대규모 파일 시스템에서 실행하고 모든 디렉토리를 재귀적으로 검색할 수 있기를 바랍니다.

온라인에서 를 사용하라고 말하는 사람을 찾았 grep지만 작동시킬 수 없습니다. 구분 기호와 이스케이프 문자의 다양한 변형을 시도했지만 얻지 못했습니다.xargssed

이것은 내가 실행하려는 명령입니다.
grep -lr -e 'page_path\\' * | xargs sed -i 's/page_path\/page_path//g'

미리 감사드립니다.

답변1

이를 사용할 때 grep | xargs파일 이름에 공백, 따옴표, 백슬래시(구현에 따라 더 많을 수도 있음)와 관련된 xargs문제가 발생하게 됩니다.

grep및 GNU 구현을 사용하면 0바이트를 구분 기호로 사용하는 다음을 xargs사용하여 이러한 문제를 피할 수 있습니다.grep -lZr ... | xargs -r0 sed ...

이제 sed 명령에 대해 설명합니다. 트릭은 s/a/b/다른 문자 대신 구분 기호로 사용할 수 있다는 것입니다. 예를 들면 다음과 같습니다 s#a#b#.

sed -i 's#page_path\\#page_path/#g'

답변2

find를 사용하여 이를 달성할 수도 있습니다.

find /your/path -type f -exec grep -l 'page_path\\' {} \; -exec sed -i 's#page_path\\#page_path/#g' {} \;

두 번째 실행은 첫 번째 실행이 성공한 경우에만 수행되며, 파일 이름에 필요한 문자를 인쇄하거나 이스케이프할 수 없는 문제는 발생하지 않습니다.

답변3

이러한 모든 명령을 호출하여 CPU 주기를 낭비하는 이유세게 때리다필요한 입력량을 줄이는 기능이 구축되어 있습니까?

str='page_path\example_filename.txt'
echo "${str//\\/\/}"

산출

page_path/example_filename.txt

답변4

ripgrep여기서도 도움이 될 수 있습니다. foo를 일치시키려는 항목으로 바꾼 다음 rg호출 및 표현식 sed에서 변경하세요 .

rg foo --files-with-matches | xargs sed -i 's/foo/bar/g'

파일 이름에 공백이 있을 수 있는 경우 ripgrep에 이를 NULL 바이트로 구분하도록 지시하십시오.

rg foo --files-with-matches -0 | xargs -0 sed -i 's/foo/bar/g'

원천:https://github.com/BurntSushi/ripgrep/blob/master/FAQ.md#search-and-replace

관련 정보