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