find 및 sed를 사용하여 파일의 특정 문장을 바꾸는 방법

find 및 sed를 사용하여 파일의 특정 문장을 바꾸는 방법

나는 디렉토리 전체에서 특정 문장의 발생을 찾아 다른 문장으로 바꾸기 위해 find및 명령을 사용하고 있습니다.sed

예를 들어, 특정 디렉토리( )의 모든 파일에서 문장의 모든 항목을 to로 바꾸려면 He went다음을 수행합니다.She goes\home\user\

find '/home/user' -type f | xargs sed -i  's/He went/She goes/g'

이제 위의 명령을 수행하고 몇 문장을 실행하고 싶습니다. 이를 위해 왼쪽에는 바꾸고 싶은 문장이, 오른쪽에는 새 문장이 포함된 탭으로 구분된 파일이 있습니다.

예를 들어

He went\tShe goes
<h1>They tried<\h1>\t<h2>They did not try<\h2>

수동으로 문장을 가져오는 대신 탭으로 구분된 파일을 수용하도록 위 명령을 수정하는 방법이 있습니까?

답변1

grep두 단계 프로세스를 통해 이 작업을 수행할 수 있습니다. 첫 번째 단계에서는 탭으로 구분된 테이블 파일을 사용하여 & 명령 세트를 생성 sed하고 이를 찾을 수 없도록 다른 계층 구조에 저장하므로 find수정 가능성이 있습니다.

##1> generate commands
sed -E '
  h;s/.*\t//
  # escape characters special on rhs
  s:[\&/]:\\&:g

  # grep code
  x;s/\t.*//w/tmp/code.grep

  # lhs escaping
  s:[][$^.*\/]:\\&:g;G

  # stitch lhs rhs & form a s/// 
  s:^|\n|$:/:g;s/.*/s&g/

' file.cmds > /tmp/code.sed

##2> use the commands

find /home/user -type f \
  -exec grep -qF -f /tmp/code.grep {} \; \
  -exec sed -i -f /tmp/code.sed {} + ;


  • 동적으로 생성된 코드 파일을 검색 중인 계층과 다른 계층 구조에 배치해야 합니다.

  • 테이블 파일은 코드 생성 중에 문자 두 개와 그 뒤에 알파벳이 \t 오는 것으로 처리되므로 기호 대신 리터럴 TAB을 사용해야 합니다 .backslasht

관련 정보