alterando string com sed, onde foi?

3
$ cat test-paths.txt 
test/sub2/configuration.php
test/sub3/configuration.php
test/configuration.php
test/sub1/configuration.php

$ cat find-host-test 
#!/bin/bash
for i in 'cat test-paths.txt'
 do 
  echo $i
  grep "public $host = '127.0.0.1';" $i
  #echo $?
  if [ $? -eq 0 ]
   then
    echo "there's config file"
    sed $i 's/$host = 127.0.0.1/$host = localhost/' 
    echo "changed to"
    grep "public $host =" $i
  fi
 done

executando find-host-test resultou em

$ bash find-host-test 
test/sub2/configuration.php
    public $host = '127.0.0.1';
there's config file
sed: can't find label for jump to 'est/sub2/configuration.php'
changed to
    public $host = '127.0.0.1';
test/sub3/configuration.php
test/configuration.php
    public $host = '127.0.0.1';
there's config file
sed: can't find label for jump to 'est/configuration.php'
changed to
    public $host = '127.0.0.1';
test/sub1/configuration.php
    public $host = '127.0.0.1';
there's config file
sed: can't find label for jump to 'est/sub1/configuration.php'
changed to
    public $host = '127.0.0.1';

Por que o desaparecimento do "t" da pasta de teste?

    
por grepmaster 13.05.2015 / 07:43

2 respostas

4

Seu sed invokation está errado.

sed 's/$host = 127.0.0.1/$host = localhost/' "$i"

Veja a página de manual de sed :

sed [OPTION]... {script-only-if-no-other-script} [input-file]

O inputfile é o último argumento, não o primeiro.

Interagir sidenote : t in sed é chamado de rótulo. Depois de t , o nome do rótulo segue. No seu caso, é o nome do arquivo de entrada sem o primeiro t . Por isso, sed tenta ir para um rótulo chamado est/sub2/configuration.php , que sed não pode encontrar em lugar algum. A segunda expressão s///g nunca é executada.

    
por chaos 13.05.2015 / 08:27
1

A razão pela qual o sed não está funcionando já foi dada pela boa resposta do caos.

Deixe-me ir um pouco além para indicar outra maneira de percorrer o arquivo, já que você está usando algumas etapas desnecessárias:

while IFS= read -r file
do
    echo "$file"
    if grep -q "public $host = '127.0.0.1';" "$file"; then
        echo "there's config file"
        sed 's/$host = 127.0.0.1/$host = localhost/' "$file"
        echo "changed to"
        grep "public $host =" "$file"
    fi
done < "test-paths.txt"

Diferenças:

  • Você está usando for i in $(cat test-paths.txt) (bem, com backticks, mas não sei como citá-los). Isso é ok, mas é melhor usar um belo while loop fazendo while read line; do ... done < file . Desta forma, você lê uma linha por vez. Veja uma discussão mais ampla sobre o tópico em Para ler linhas em vez de palavras, direcione / redirecione para um loop 'while read'.

  • Além disso, o uso de backticks é obsoleto. É melhor usar $() , pois é possível aninhá-los. (Na verdade, nós já observamos que isso é ruim ao postar uma resposta aqui :))

  • Não há necessidade de grep "something" e, em seguida, verifique o status $? . Você pode usar diretamente grep -q para isso.

  • Algumas dessas sugestões também podem ser encontradas colando seu script no link .

por fedorqui 13.05.2015 / 11:16