Substituir string no script bash

1

Eu tentei o seguinte comando no meu script:

find=grep "$jasper" jasperreports.properties | awk -F"reports/" '{print }'

Exemplo de saída:

maps

Eu quero alterar essa saída para outra coisa, por exemplo %código%. Para isso, eu tentei:

sed -i /"$find"/charts

charts está me causando problemas, ele precisa de um arquivo de entrada, mas eu não tenho um. Existe uma maneira de canalizar a saída do grep e awk para sed?

    
por moata_u 15.03.2011 / 10:12

3 respostas

1

-i só pode ser usado com sed se você estiver passando um arquivo, significa "substituir inline". Sem isso, a saída do sed seria gravada em stdout (geralmente a saída do console). Com -i , ele faz um substituto in-line , ou seja, fazendo substituições no próprio arquivo.

O próximo código lê o conteúdo de jasperreports.properties na variável $input (linha 1) e localiza a sequência a ser substituída (linha 2).
Na terceira linha, ele envia a string de entrada e o canaliza em sed para substituição. sed envia a string para stdout , que será capturada por $( e ) e, portanto, será armazenada em $input .

read input < jasperreports.properties
find=$(grep "$jasper" jasperreports.properties | awk -F"reports/" '{print }')
input=$(echo "$input" | sed "s/$find/charts/")

Se você deseja aplicar as alterações imediatamente ao arquivo:

find=$(grep "$jasper" jasperreports.properties | awk -F"reports/" '{print }')
sed "s/$find/charts/" -i jasperreports.properties

Em man sed :

   s/regexp/replacement/
          Attempt   to   match  regexp  against  the  pattern  space.   If
          successful, replace that portion matched with replacement.   The
          replacement may contain the special character & to refer to that
          portion of the pattern space  which  matched,  and  the  special
          escapes    through    to refer to the corresponding matching
          sub-expressions in the regexp.
    
por Lekensteyn 15.03.2011 / 13:49
1

Você sempre pode fornecer um pseudo arquivo com a sintaxe < <(command) substituição de processo :

sed -e "/$find/charts" < <(grep "$jasper" jasperreports.properties | awk -F"reports/" '{print }')
    
por l0b0 15.03.2011 / 10:30
0
jasper=( maps charts widgets )
jasper1=( Maps Charts Widgets )


count=${#jasper[*]}            
jasper_path='find . -type f -name 'jasperreports.properties''

count=${#jasper[*]}
for (( i=0;i<$count;i++ )); do
sed -i "/${jasper[i]}.base/c com.jaspersoft.jasperreports.fusion.${jasper[i]}.base.swf.url=https://$host/webcare/reports/${jasper1[i]}" $jasper_path
done

outra solução ()
find=$(grep "maps.base" jasperreport.properties | awk -F"reports/" '{print }';sed "s/$find/$host/" jasperreport.properties > tmp.txt.txt && mv tmp.txt jasperreport.properties

o que estamos tentando fazer é o seguinte:
1. encontrar todos os arquivos no diretório que tem nome jasperreport.properties (que incluem 3 linhas como você vê a partir do código anterior, três linhas mesma palavra diferente "mapas, gráficos, widgets")

2.ponte para cada linha individualmente e altere o endereço IP do host para 3 linhas, com a preocupação de manter "mapas, gráficos, widgets" no meio e "Mapas, Gráficos, Widgets" no final e como você vê as 3 palavras no final começar com capital ...

    
por moata_u 15.03.2011 / 18:00