grep 및 sed를 사용하여 문자열 찾기 및 바꾸기
다음을 사용하여 디렉토리에서 특정 문자열을 재귀 적으로 검색하고 다른 문자열로 바꿉니다.
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g'
이것은 잘 작동합니다. 유일한 문제는 문자열이 존재 sed
하지 않으면 인수를 얻지 못하기 때문에 실패한다는 것입니다. ANT와 함께 자동으로 실행하고 실패 이후 빌드가 실패하기 때문에 이것은 나에게 문제입니다 sed
.
문자열을 찾을 수없는 경우 오류를 방지 할 수있는 방법이 있습니까?
사용할 수있는 한 줄 간단한 솔루션에 관심이 있습니다 (반드시 grep
또는 sed
이와 같은 일반적인 유닉스 명령과 함께 사용).
당신은 사용할 수 있습니다 find
및 -exec
직접 sed
하기보다는 먼저 찾기 oldstr
로 grep
. 다소 덜 효율적일 수 있지만 중요하지 않을 수 있습니다. 이런 식으로 sed
에 의해 나열된 모든 파일에 대해 대체가 실행 find
되지만 그렇지 oldstr
않은 경우 분명히 작동하지 않습니다.
find /path -type f -exec sed -i 's/oldstr/newstr/g' {} \;
귀하의 솔루션은 괜찮습니다. 이 방법으로 만 시도하십시오.
files=$(grep -rl oldstr path) && echo $files | xargs sed....
따라서 xargs
grep return 0
, 예를 들어 일부 파일에서 문자열을 찾았을 때만 실행하십시오 .
Standard xargs
는 그것을 할 좋은 방법이 없습니다. find -exec
다른 사람이 제안한대로 사용 하거나 sed
인수가 없으면 아무 작업도 수행하지 않는 스크립트로 래핑하는 것이 좋습니다 . GNU xargs
에는 --no-run-if-empty
옵션이 있으며 BSD / OS X xargs
에는 -L
비슷한 작업을 수행해야하는 옵션이 있습니다.
나는 Vlad의 아이디어를 가져 와서 조금 변경했습니다. 대신에
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' /dev/null
어느 양보
sed: couldn't edit /dev/null: not a regular file
원격 서버에 3 개의 다른 연결을하고 있습니다.
touch deleteme
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' ./deleteme
rm deleteme
덜 우아하고 서버에 2 개의 연결이 더 필요하지만 (한 줄로 모두 수행하는 방법이있을 수 있음) 작업도 효율적으로 수행합니다.
나는 사용하지 않고 아무것도 발견되지 않을 경우 적어도 하나의 인수로 -exec
제공 할 수 있다고 생각합니다 /dev/null
.
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' /dev/null
내 사용 사례는 다음 코드 로 대체 foo:/Drive_Letter
하고 싶었습니다 foo:/bar/baz/xyz
. 나는 대량의 파일이있는 동일한 디렉토리 위치에있었습니다.
find . -name "*.library" -print0 | xargs -0 sed -i '' -e 's/foo:\/Drive_Letter:/foo:\/bar\/baz\/xyz/g'
도움이 되었기를 바랍니다.
고정 문자열이나 패턴을 바꾸려면 bash 내장 패턴 문자열 대체 변수 대체 구문을 추가하고 싶습니다. 직접 설명하는 대신 bash 매뉴얼의 섹션을 인용하고 있습니다.
${parameter/pattern/string}
패턴은 경로 이름 확장에서와 마찬가지로 패턴을 생성하도록 확장됩니다. 매개 변수 가 확장되고 해당 값에 대한 가장 긴 패턴 일치 가 string 으로 대체됩니다 . 경우 패턴이 시작
/
, 모든 일치 패턴은 문자열로 대체됩니다. 일반적으로 첫 번째 일치 만 교체됩니다. 패턴 이로 시작하는 경우 매개 변수#
의 확장 된 값 시작 부분에서 일치해야합니다 . 패턴 이로 시작하는 경우 매개 변수 의 확장 된 값 끝에서 일치해야합니다 . 문자열 이 null 인 경우 패턴 일치%
삭제되며/
다음 패턴 은 생략 될 수 있습니다. 경우 파라미터 이다@
또는*
상기 대체 동작은 차례로 각각의 위치 파라미터에인가되고, 팽창 얻어진리스트이다. 경우 파라미터 와 첨자 배열 변수@
또는*
상기 대체 동작이 차례로 배열의 각 부재에인가되고, 상기 팽창 얻어진리스트이다.
참고 URL : https://stackoverflow.com/questions/6178498/using-grep-and-sed-to-find-and-replace-a-string
'Nice programing' 카테고리의 다른 글
Python에서 임의의 정수 목록 만들기 (0) | 2020.11.08 |
---|---|
파일> 새 MVC 3 프로젝트의 새로운 "HTML5 의미 마크 업 사용"옵션 (0) | 2020.11.08 |
PyQt 또는 PySide-사용할 항목 (0) | 2020.11.08 |
파이썬 파일을 실행할 때 어떻게 독 스트링을 인쇄 할 수 있습니까? (0) | 2020.11.08 |
Task에서 예외를 포착하는 가장 좋은 방법은 무엇입니까? (0) | 2020.11.08 |