3 votos

Usando sed con URL da salida vacía cuando redirigir al archivo

Estoy usando el zsh shell. Estoy tratando de usar sed a sustituir a algunos de texto en varios archivos, utilizando en paralelo para acelerar el proceso. Cuando he probado esto en un archivo y dejar que la salida del comando ir a stdout vi el resultado esperado. Cuando traté de redirigir la salida a un archivo tengo un archivo vacío. ¿Qué está pasando? He aquí un ejemplo trivial utilizando un solo hecho de que los datos de archivo puede cortar y pegar para ilustrar...

setopt interactivecomments
#  In this trivial example it is obviously non-sensical
#  to use parallel, but in reality I have many files...

#  Some very simple input data...
paste <(printf "%s\n" `seq 1 4`) <(printf "%s\n" `seq 1 4`) > ./input.txt
#  This looks like:
#1       1
#2       2
#3       3
#4       4


#  Pass data file to parallel and use sed to substitute.
#  e.g. want to replace line '3 3' with '3 33'
#  Output goes to stdout & seems correct...
z=`find ./input.txt`
echo "$z" | parallel 'sed "s/\(^3.*3\)/\13/"'
#1       1
#2       2
#3       33    ===> correct replacement
#4       4

# But redirecting to a file leads to empty file...
echo "$z" | parallel 'sed "s/\(^3.*3\)/\13/" > {//}/result.txt'

# Empty file
cat ./result.txt

¿Por qué? Estoy especificando algo incorrecto?

Estoy utilizando:

  • Ubuntu 12.04.4 LTS
  • GNU parallel 20130522
  • GNU sed version 4.2.1
  • zsh 4.3.17

3voto

Dženan Puntos 306

Cuando se utiliza la redirección en el interior del comando de parallel, usted tiene que utilizar {} poner la entrada en el lugar correcto, como parámetro de sed:

echo "$z" | parallel 'sed "s/\(^3.*3\)/\13/" {} > {//}/result.txt'

Además, si {//} (o cualquier otra cadena de reemplazo) se utiliza, parallel no anexar la entrada al final del comando automáticamente. (En este caso que sería un error de todos modos, como sería después de la redirección. )

Esencialmente, el código en cuestión se ejecuta

sed "s/(^3.*3\)/\13/" > ./result.txt

pero tiene que ser

sed "s/(^3.*3\)/\13/" ./input.txt > ./result.txt

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: