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' {} \;
두 번째 실행은 첫 번째 실행이 성공한 경우에만 수행되며, 파일 이름에 필요한 문자를 인쇄하거나 이스케이프할 수 없는 문제는 발생하지 않습니다.
답변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