único comando para sed e usar valor de entrada duas vezes de forma diferente

1

Eu tenho um arquivo com valores de entrada na forma de: input-prefix:value .

Eu preciso substituir input-prefix duas vezes por substituição diferente e passá-lo para um comando como my-command replace1-prefix:value replace2-prefix:value . Isso é possível com um único comando ou tenho que fazer o script?

Com um valor é simples

cat my-input-file | sed 's/input-prefix/replace1-prefix/' | xargs -r my-command

TIA para qualquer assistência,

W.

    
por wciesiel 31.05.2017 / 10:32

2 respostas

2

Você pode agrupar partes de um padrão com \(\) e, posteriormente, consultá-lo por (ou ... se você tiver mais grupos em um padrão):

s/input-prefix:\(.*\)/replace1-prefix: replace2-prefix:/
    
por 31.05.2017 / 10:39
0

Também é simples com vários valores. Primeiro, você pode pular o comando cat no seu pipe, porque sed irá ler o arquivo e imprimir sua saída para STDOUT . E sed funciona da maneira descrita por @Philippos (e será usado duas vezes, pois pertence ao primeiro grupo de captura). Apenas remova o eco no comando xargs para executar seu comando. Se você quiser ver o comando que foi chamado, você pode adicionar o parâmetro -t para ver o comando ou -p para executá-lo interativo. Portanto, você precisa declarar sim / não antes de executar o comando.

user@pc:/tmp$ cat inputfile.txt 
input-prefix1:value1
input-prefix:value
input-prefix2:value2

user@pc:/tmp$ sed 's/^input-prefix:\(.*\)$/replace1-prefix:\nreplace2-prefix:/g' inputfile.txt
input-prefix1:value1
replace1-prefix:value
replace2-prefix:value
input-prefix2:value2 

user@pc:/tmp$ sed 's/^input-prefix:\(.*\)$/replace1-prefix:\nreplace2-prefix:/g' inputfile.txt | xargs -r echo my-command

Nota curta: Isso pressupõe que seu prefixo de entrada é a primeira coisa na linha que você deseja substituir e o valor é todo o resto da linha atrás do sinal de dois pontos. Além disso, o modificador g no comando sed substituirá todas as ocorrências do seu input-prefix: no inputfile.txt .

    
por 31.05.2017 / 13:08