나는 디렉토리 전체에서 특정 문장의 발생을 찾아 다른 문장으로 바꾸기 위해 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을 사용해야 합니다 .backslash
t