전체 파일 트리를 스캔하고 모든 행을 두 개의 일치 항목으로 두 번 바꾸고 싶습니다. 즉:
printf("Hello WORLD! %s, %d\n",bcm_errstr(rv),var);
dprintf("kjhgjkhfkhgfjgd %s\n",bcm_errstr(rv));
되어야 한다
printf("Hello WORLD! %d, %d\n",rv,var);
dprintf("kjhgjkhfkhgfjgd %d\n"rv);
다음을 시도했지만 성공하지 못했습니다( sed.c
내 테스트 파일에는 쿼리와 일치하는 두 줄이 포함되어 있습니다).
p$ grep printf | grep "%s" | grep -rl bcm_errmsg\(rv\) sed.c | xargs sed -i -e 's/%s/%d/' -e 's/bcm_errstr\(rv\)/rv/'
파일 이름은 알 수 없지만 파일 내용을 보고 있기 때문에 grep
대신 사용합니다 .find
콘텐츠 sed.c
:
$ cat sed.c printf("kjhlkjhlkjh%dkjhgljhglj\n",bcm_errmsg(rv));
dprintf("HELLO WORLD %d %d\n",test,bcm_errmsg(rv));
즉 , , 및 가 sed
포함된 줄에 두 개의 대체 항목만 적용하고 싶습니다 .printf
%s
bcm_errstr(rv)
답변1
find
재귀를 사용하여 파일을 가져온 다음 sed
인라인으로 변경할 수 있습니다. 귀하의 목표를 올바르게 이해하면 다음과 같이 작동합니다.
find . -print0 | xargs -0 sed -i 's/%s/%d/g; s/bcm_errstr(rv)/rv/g;'
노트:이는 아마도 원하는 것보다 더 잘 일치할 수 있지만 나열한 대상 동작은 매우 제한적입니다. 찾으려는 파일만 필터링하려면 찾기 섹션을 조정해야 합니다.
답변2
sed -e '/%s/{/bcm_errmsg(rv)/{' -e 's//rv/;s/%s/%d/' -e '}' code.c
변경되는 내용이 일정하다고 가정합니다(예: bcm_errmsg(rv) => rv 항상).
나는 이것이 코드를 스스로 문서화하게 만드는 것을 좋아합니다.
sed -e '
/^d\{0,1\}printf(/!b
/%s/{
/bcm_errms(rv)/{
s//rv/
s/%s/%d/
}
}
' code.c