Nice programing

grep 및 sed를 사용하여 문자열 찾기 및 바꾸기

nicepro 2020. 11. 8. 11:03
반응형

grep 및 sed를 사용하여 문자열 찾기 및 바꾸기


다음을 사용하여 디렉토리에서 특정 문자열을 재귀 적으로 검색하고 다른 문자열로 바꿉니다.

grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g'

이것은 잘 작동합니다. 유일한 문제는 문자열이 존재 sed하지 않으면 인수를 얻지 못하기 때문에 실패한다는 것입니다. ANT와 함께 자동으로 실행하고 실패 이후 빌드가 실패하기 때문에 이것은 나에게 문제입니다 sed.

문자열을 찾을 수없는 경우 오류를 방지 할 수있는 방법이 있습니까?

사용할 수있는 한 줄 간단한 솔루션에 관심이 있습니다 (반드시 grep또는 sed이와 같은 일반적인 유닉스 명령과 함께 사용).


당신은 사용할 수 있습니다 find-exec직접 sed하기보다는 먼저 찾기 oldstrgrep. 다소 덜 효율적일 수 있지만 중요하지 않을 수 있습니다. 이런 식으로 sed에 의해 나열된 모든 파일에 대해 대체가 실행 find되지만 그렇지 oldstr않은 경우 분명히 작동하지 않습니다.

find /path -type f -exec sed -i 's/oldstr/newstr/g' {} \;

귀하의 솔루션은 괜찮습니다. 이 방법으로 만 시도하십시오.

files=$(grep -rl oldstr path) && echo $files | xargs sed....

따라서 xargsgrep 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

반응형