Sed problema em um script Bash

2

Estou com problemas ao usar o comando sed . Estou tentando escrever um script bash que faz o seguinte:

  1. pesquise a linha que contém :@
  2. salve a linha que continha :@ e substitua-a por nova linha

como no seguinte:

#! /bin/bash

echo "Please enter the ip address of you file"
read ipnumber
find='grep ':@' application.properties' # find the line
input="connection.url=jdbc\racle\:thin\:@$ipnumber\:1521\:billz" # preparing new line
echo 'sed "s/'${find}'/'${input}'/g" application.properties' # replace old with new line

O problema é: nada acontece.

Eu já tentei usar "${find}" em vez de '${find}'

    
por moata_u 03.03.2011 / 08:29

2 respostas

6

Existem vários problemas com esse snippet. Eu recomendo que você aprenda um pouco melhor a sintaxe do bash antes de escrever scripts nele.

De qualquer forma, se você quiser editar um arquivo, você quer um editor de arquivos. sed não é um editor de arquivos. Eu acredito que isso vai fazer o que você quiser.

#!/bin/bash

read -p "Enter the ip address: " ipnumber

ed -s application.properties << EOF
/:@/c
connection.url=jdbc:oracle:thin:@$ipnumber:1521:billz
.
w
EOF

O que esse script diz é: /:@/c - na primeira linha que contém :@ , c altere a linha com tudo seguindo até uma linha contendo apenas . . Então w to w escreve as alterações no arquivo.

Veja link para obter ajuda com a edição usando ed e link para aprender bash.

Atualização:
sed pode ser usado para conseguir o mesmo, mas não pode editar arquivos, só pode ser usado para criar um novo arquivo.

# POSIX
sed "/:@/c\
connection.url=jdbc:oracle:thin:@$ipnumber:1521:billz" application.properties

Aqui sed irá mostrar o arquivo com as alterações aplicadas. Você pode redirecionar para um novo arquivo e movê-lo para o antigo. O GNU sed também possui uma opção -i não padronizada que faz a última parte de forma transparente. O GNU sed também não requer que você tenha essa nova linha no script sed.

# GNU sed
sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ipnumber:1521:billz" application.properties

Observe que o ed só substituirá a linha primeiro que corresponde ao regex, enquanto o sed substituirá todas as linhas correspondentes ao regex.

    
por geirha 03.03.2011 / 09:04
-1

meu problema era: eu estava usando um nome de variável (valor) , que é reservado :))
A solução é:

#!/bin/bash

read -p "Please Enter The ip address : " ipnum 
find='grep ":@" application.properties'
test="connection.url=jdbc:oracle:thin:@$ipnum:1521:e"
sed -i "s/"$find"/"$test"/g" application.properties

AGRADECIMENTOS geirha

por moata_u 03.03.2011 / 13:26