Cambio de cadena con SED, ¿a dónde fue? -- mmand-line campo con bash campo con sed campo con scripts camp askubuntu Relacionados El problema

changing string with sed, where did it go?


3
vote

problema

Español
  ABCDEFGHIJKLMNABCDEFGHIJKLMN5   

ejecutando find-host-test resultó en

  $ 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 qué la desapercialización de "t" de la carpeta de prueba?

Original en ingles
$ 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 

running find-host-test resulted in

$ 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'; 

Why the disappereance of "t" of test folder?

           

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

Su ABCDEFGHIJKLMNABCDEFGHIJKLMN0 La invocación es incorrecta.

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

Ver la página Manual de ABCDEFGHIJKLMNABCDEFGHIJKLMN2 :

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

El archivo de entrada es el último argumento, no primero.

intereseguida (código> t en sed se llama una etiqueta. Después de t El nombre de la etiqueta sigue. En su caso, es el nombre de archivo de entrada sin el líder t . ABCDEFGHIJKLMNABCDEFGHIJKLMN8 Intenta saltar a una etiqueta llamada est/sub2/configuration.php , que sed 's/$host = 127.0.0.1/$host = localhost/' "$i" 0 no puede encontrar en ningún lugar. La segunda expresión sed 's/$host = 127.0.0.1/$host = localhost/' "$i" 1 nunca se ejecuta.

 

Your sed invokation is wrong.

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

See the manual page of sed:

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

The inputfile is the last argument, not hte first.

Interessting sidenote: t in sed is called a label. After t the name of the label follows. In your case it's the input filename without the leading t. sed therefore tries to jump to a label called est/sub2/configuration.php, which sed cannot find anywhere. The second expression s///g is never executed.

 
 
1
 
vote

La razón por la cual su sed 's/$host = 127.0.0.1/$host = localhost/' "$i" 2 no funciona, ya estaba dado por la buena respuesta del CHAOS.

Permítanme pasar un poco más adelante para indicar otra forma de bucle a través de su archivo, ya que está utilizando algunos pasos innecesarios:

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

Diferencias:

  • Usted está utilizando sed 's/$host = 127.0.0.1/$host = localhost/' "$i" 4 (Bueno, con BackTicks, pero no sé cómo citarlos). Esto está bien, pero es mejor usar un hermoso sed 's/$host = 127.0.0.1/$host = localhost/' "$i" 5 bucle haciendo sed 's/$host = 127.0.0.1/$host = localhost/' "$i" 6 . De esta manera lees una línea a la vez. Consulte una discusión más amplia sobre el tema en para leer líneas en lugar de palabras, pipe / redirect a un 'while Leer 'Loop.

  • también, usando los títulos de respaldo está en desuso. Es mejor usar sed 's/$host = 127.0.0.1/$host = localhost/' "$i" 7 , ya que es posible anidarlos. (De hecho, ya observamos que esto es aún malo al publicar una respuesta aquí :))

  • No hay necesidad de sed 's/$host = 127.0.0.1/$host = localhost/' "$i" 8 y luego verifique el estado sed 's/$host = 127.0.0.1/$host = localhost/' "$i" 9 . Puede usar directamente sed0 para esto.

  • Algunas de estas sugerencias también se pueden encontrar pegando su script en http: //www.shellcheck. neto / .

 

The reason why your sed is not working was already given by chaos's good answer.

Let me go a bit step further to indicate another way to loop through your file, since you are using some unnecessary steps:

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" 

Differences:

  • You are using for i in $(cat test-paths.txt) (well, with backticks, but I don't know how to quote them). This is ok, but it is better to use a beautiful while loop doing while read line; do ... done < file. This way you read one line at a time. See a broader discussion about the topic in To read lines rather than words, pipe/redirect to a 'while read' loop.

  • Also, using backticks is deprecated. It is better to use $(), since it is possible to nest them. (In fact, we already observed this is even bad when posting an answer here :) )

  • There is no need to grep "something" and then check the $? status. You can directly use grep -q for this.

  • Some of these suggestions can be also found by pasting your script in http://www.shellcheck.net/.

 
 
 
 

Relacionados problema

11  Ejecute scripts automáticamente en el servidor después de la conexión SSH  ( Run scripts automatically in server after ssh connection ) 
Cómo ejecutar un script automáticamente en el servidor Poco después de que el sistema del cliente establezca la conexión SSH con el servidor para ex: Supong...

9  ¿Cómo apagar Ubuntu después de (2 horas) de inactivo?  ( How to shutdown ubuntu after 2 hours of idle ) 
Correr: Xubuntu 14.04 32bit. He leído varias desactualizadas, no funcionando, trabajando diferente que quiero respuestas aquí y en otros lugares. Tuve un gu...

0  Script Shell para instalar software y configurar la red  ( Shell script to install software configure network ) 
Oye, quería saber cómo, después de una nueva instalación de Ubuntu, puedo instalar todos los softwares esenciales (VLC, Apache, MySQL, PHP, Java, NetbeanSetc)...

22  Script de bash que no se ejecuta desde crontab [duplicado]  ( Bash script not executing from crontab ) 
Esta pregunta ya tiene respuestas aquí : ¿Por qué los scripts de Crontab no funcionan? ...

2  Abra la carpeta principal de un enlace simbólico a través de clic con el botón derecho?  ( Open the parent folder of a symbolic link via right click ) 
Podemos abrir una carpeta principal de cualquier archivo usando Script Nautilus como #!/bin/bash nautilus "$1" Si hago este script en el enlace simbó...

6  Mi función de bash se ejecuta solo una vez por terminal abierto  ( My bash function runs only once per terminal opened ) 
Cuando intento ejecutar mi función de bash, definida en .bashrc, por segunda vez en el mismo terminal, no funciona. El código es el siguiente: lspci6 ...

2  ¿Cómo monitorear un archivo local para cambios, aplique un REGEX reemplazarlo y guardar / sobrescribir a un archivo de destino?  ( How to monitor a local file for changes apply a regex replace on it and save ov ) 
Me gustaría comenzar un script o algo que vea un archivo de texto para cambios. Cuando cambie el archivo, quiero ejecutarlo a través de un analizador REGEX pa...

0  Diferentes etapas en la programación de bash  ( Different stages in bash programming ) 
Tengo un programa de bash con diferentes etapas como: $stage=1 if [ stage -le 1]; then echo "execute stage 1" fi if [ stage -le 2]; then echo "execute sta...

3  dpkg sin shell  ( Dpkg with no shell ) 
¿Cómo ejecutar DPKG sin shell? Aquí está mi problema: HECHO Y AUTORUN.SH Script en mi clave USB. Para ejecutar este script, creé reglas en /etc/udev/ru...

135  ¿Cómo ejecutar un script simplemente haciendo doble clic en los archivos similares en Windows?  ( How to execute a script just by double clicking like exe files in windows ) 
¿Cómo puedo hacer que un script de Bash sea ejecutable haciendo doble clic al igual que ABCDEFGHIJKLMNABCDEFGHIJKLMN5 archivos en Windows? Lo intenté crean...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos