várias substituições em uma única linha com sed

0

Eu gostaria de escanear uma árvore de arquivos inteira e fazer duas substituições em qualquer linha com duas correspondências, ou seja:

printf("Hello WORLD! %s, %d\n",bcm_errstr(rv),var);
dprintf("kjhgjkhfkhgfjgd %s\n",bcm_errstr(rv));

deve se tornar

printf("Hello WORLD! %d, %d\n",rv,var);
dprintf("kjhgjkhfkhgfjgd %d\n"rv);

Eu tentei o seguinte sem sucesso ( sed.c sendo meu arquivo de teste contendo duas linhas que corresponderão à consulta): 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/'

Eu uso grep em vez de find porque os nomes dos arquivos são desconhecidos, mas estou vendo o conteúdo do arquivo.

Conteúdo de sed.c :

 $ cat sed.c  printf("kjhlkjhlkjh%dkjhgljhglj\n",bcm_errmsg(rv)); 
 dprintf("HELLO WORLD %d %d\n",test,bcm_errmsg(rv));

i.e. Quero aplicar as duas substituições de sed apenas às linhas com printf , %s e bcm_errstr(rv) nelas.

    
por cerr 05.07.2017 / 18:58

2 respostas

1

Você pode usar find para obter os arquivos de forma recursiva e, em seguida, sed para fazer as alterações em linha. Isso deve funcionar se eu entender sua meta corretamente:

find . -print0 | xargs -0 sed -i 's/%s/%d/g; s/bcm_errstr(rv)/rv/g;'

Observação: que isso pode corresponder a mais do que você deseja, mas você tem um comportamento de destino bastante limitado listado. Você precisará ajustar a parte de localização para filtrar somente os arquivos que está segmentando.

    
por 05.07.2017 / 19:33
1
sed -e '/%s/{/bcm_errmsg(rv)/{' -e 's//rv/;s/%s/%d/' -e '}' code.c

Desde que as coisas mudem são constantes, ou seja, bcm_errmsg (rv) = > rv sempre.

Eu gosto desse jeito; o que torna o código quase auto-documentável.

sed -e '
   /^d\{0,1\}printf(/!b
   /%s/{
      /bcm_errms(rv)/{
         s//rv/
         s/%s/%d/
      }
   }
' code.c
    
por 05.07.2017 / 19:33