utilizar sorteos rango pedir para numeros numero google generar generador dentro como aleatorios aleatorio shell sed

shell - sorteos - numeros aleatorios google



El comando sed crea archivos con nombres aleatorios (4)

Entonces, después de muchas pruebas anoche, resultó que sed estaba creando estos archivos cuando intentaba operar en una cadena vacía. La forma en que obtenía la matriz de argumentos "$ string1" era a través de un comando grep, que parece estar mal formado. Lo que quería del grep eran todas las líneas que contenían algo del tipo "Texto aquí". ''".

Por ejemplo, la cadena, " Text here ''ABC.DEF'' " en un archivo, debería haber sido atrapada por grep, luego la porción ABC.DEF de la cadena, sería sustituida por ABC_DEF . Desafortunadamente, el grep que estaba utilizando detectaría líneas del tipo " Text here '''' " (es decir, nada entre el ""). Cuando más tarde, el script intentó realizar un reemplazo sed utilizando esta cadena vacía, se creó el archivo aleatorio (probablemente porque sed murió).

Gracias por toda su ayuda para entender cómo funciona sed.

Hace poco escribí un script que hace un comando sed, para reemplazar todas las ocurrencias de "cadena1" con "cadena2" en un archivo llamado "prueba.txt".

Se parece a esto:

sed -i ''s/string1/string2/g'' test.txt

El problema es que "string1" no existe necesariamente en test.txt.

Después de ejecutar un montón de estos comandos sed, me doy cuenta de que tengo varios archivos vacíos, que quedan en el directorio, con nombres que se ven así:

"sed4l4DpD"

¿Alguien sabe por qué esto podría ser y cómo puedo corregirlo?


No pude reproducir esto con una prueba rápida (usando GNU sed 4.2.1) - pero strace sí mostró a sed creando un archivo llamado sedJd9Cuy y luego renombrándolo a tmp (el archivo nombrado en la línea de comando).

Parece que algo va mal después de que sed crea el archivo temporal y antes de que pueda cambiarle el nombre.

Mi mejor suposición es que te has quedado sin espacio en el sistema de archivos; puede crear un nuevo archivo vacío, pero no puede escribir en él.

Que hace df . ¿decir?

EDITAR :

Todavía no sé qué está causando el problema, pero no debería ser demasiado difícil evitarlo.

Más bien que

sed -i ''s/string1/string2/g'' test.txt

intente algo como esto:

sed ''s/string1/string2/g'' test.txt > test.txt.$$ && mv -f test.txt.$$ test.txt

Algo anda mal con la forma en que sed crea y luego cambia el nombre de un archivo de texto para reemplazar el archivo original. El comando anterior usa sed como un simple filtro de entrada-salida y crea y cambia el nombre del archivo temporal por separado.


-i es el sufijo dado al archivo nuevo / de salida. Además, necesitas -e para el comando.
Así es como lo usa:

sed -i ''2'' -e ''s/string1/string2/g'' test.txt

Esto creará un archivo llamado test.txt2 que es la copia de seguridad de test.txt

Para reemplazar el archivo (en lugar de crear una copia nueva, llamada sustitución "en el lugar"), cambie el valor -i a '''' (es decir, en blanco):

sed -i '''' -e ''s/string1/string2/g'' test.txt

EDIT II

Aquí está la salida de línea de comando real de una Mac (Snow Leopard) que muestra que mi respuesta modificada (espacio eliminado entre -i y el sufijo) es correcta.
NOTA: en un servidor Linux, no debe haber espacio entre él -i y el sufijo.

> echo "this is a test" > test.txt > cat test.txt this is a test > sed -i ''2'' -e ''s/a/a good/'' test.txt > ls test* test.txt test.txt2 > cat test.txt this is a good test > cat test.txt2 this is a test > sed -i '''' -e ''s/a/a really/'' test.txt > ls test* test.txt test.txt2 > cat test.txt this is a really good test


Es mejor si lo haces de esta manera:

cat large_file | sed ''s/string1/string2/g'' > file_filtred