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 교체는 일치하는 문자열의 일부이기 %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 님, 귀하의 의견이 많은 도움이 되었습니다. :)

관련 정보