Linux 커널 코드에서 %p를 %pK로 바꾸십시오.

Linux 커널 코드에서 %p를 %pK로 바꾸십시오.

저는 Linux 드라이버를 유지 관리하고 있으며 드라이버의 모든 %p를 %pK로 바꾸고 싶습니다. 이를 위해 다음 명령을 사용했습니다.

grep "%p[^K]" -Rl . | xargs sed -i 's/%p[^K]/%pK/g'

다음과 같은 경우에는 실패합니다.

%p-%p --> %pK%pK (hyphen is removed)

sed 명령이 제대로 작동하도록 올바른 정규식을 제안하십시오.

답변1

질문의 sed 대체는 a가 일치하는 문자열의 일부이기 %p때문에 대시뿐만 아니라 a 뒤의 모든 문자를 제거합니다. (이스케이프 처리된) 대괄호를 사용하여 다음 문자를 캡처한 다음 를 사용하여 다시 배치하면 이 문제를 해결할 [^K]수 있습니다 . 존재하다 :%p\1sed

$ echo '%p %p %pK' | sed 's/%p\([^K]\)/%pK\1/g'
%pK %pK %pK

[^a-zA-Z]다른 수정자를 사용하려는 경우 또는 이와 유사한 것을 사용하고 싶을 수도 있습니다 %p.

답변2

다음 명령은 나에게 놀라운 일입니다

for fname in $(grep "%p[^K]" -Rl .); do perl -pi -e 's/%p(?!K)/%pK/g' $fname; done

Sundeep님, 귀하의 의견이 매우 도움이 되었습니다. :)

관련 정보