sed를 사용하여 한 줄에 여러 대체 수행

sed를 사용하여 한 줄에 여러 대체 수행

전체 파일 트리를 스캔하고 모든 행을 두 개의 일치 항목으로 두 번 바꾸고 싶습니다. 즉:

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%sbcm_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

관련 정보