디렉터리의 모든 파일에서 3줄의 코드를 검색하고 제거하는 데 도움이 필요합니다.
코드는 다음과 같습니다
if ( file_exists( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' ) ) {
include_once( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' );
}
교체보다는 제거만 하면 됩니다.
어떤 아이디어가 있나요?
광고 건배
답변1
perl -0777 -i~ -pe "s{^\\Qif ( file_exists( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' ) ) { \E\n\Q include_once( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' ); \E\n}\n}{}m" -- dir/*
0777
"후루룩 모드"를 활성화합니다. 즉, 한 줄씩 읽는 대신 전체 파일을 로드합니다.-i
파일을 "제자리"로 변경하여 이름에 추가된 백업을 생성합니다~
.~
-p
처리 후 입력 내용을 인쇄합니다.- 이 코드는 단지 대체 코드이지만
s{}{}
전체 파일을 로드할 때 세 줄을 실행합니다. - Final
m
수정자는 : 의 동작을 변경하여^
문자열의 시작 부분을 일치시키는 대신 이제 각 줄의 시작 부분과 일치시킵니다. - 따옴표 사이에 모든 내용을 포함
\Q...\E
하므로 특수 문자에 백슬래시를 추가할 필요가 없습니다.
find
이를 하위 디렉터리의 재귀 실행과 결합 할 수 있습니다 . 그러나 교체 구분 기호를 {}
다음과 같이 변경해야 합니다 find -exec
.
find /dir -type f -exec perl -i~ -0777 -pe "s<^\\Qif ( file_exists( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' ) ) { \E\n\Q include_once( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' ); \E\n}\n><>m" -- {} +
답변2
find /dir -type f -print0 \
| xargs -0r grep -Fn "$(cat << 'EOT'
if ( file_exists( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' ) ) {
include_once( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' );
}
EOT
)" \
| tac \
| while IFS=: read -r file_name line_number _; do
sed -i "${line_number}d" "$file_name" # You can dry run by commenting out this line.
echo "Removed ${line_number}th line from $file_name"
done
sed
행 번호를 사용하여 행을 삭제합니다 grep
.
grep -n
: 일치하는 줄 번호를 표시합니다.grep -F
: 고정 문자열과 일치합니다. 성능을 위해 작동합니다.tac
백 라인에서 제거 용 . 줄 번호 변경을 방지합니다.sed -i "${line_number}d" "$file_name"
:$line_number
다음에서 제거$file_name
...
답변3
같은 바이러스가 있는데 메모장++를 통해 텍스트를 삭제했습니다.
if ( file_exists( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' ) ) {\r\n\x20\x20\x20\x20include_once( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' );\r\n}
공백으로 바꿉니다.
답변4
다음 명령을 사용하여 PATTERN이 포함된 줄과 다음 n줄(귀하의 경우 2줄)을 삭제할 수 있습니다.
sed '/PATTERN/,+2d'
첫 번째 줄의 PATTERN 부분이 작업을 수행해야 합니다.