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

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

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

grep웹에서 , xargs및 를 사용하라고 말한 사람을 찾았 sed지만 제대로 작동하지 못했습니다. 구분 기호와 이스케이프 문자에 대해 다양한 변형을 시도했지만 이해하지 못했습니다.

내가 실행하려고 했던 명령은 다음과 같습니다.
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' {} \;

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

답변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

관련 정보