comando único para sed y usar el valor de entrada dos veces en forma diferente

comando único para sed y usar el valor de entrada dos veces en forma diferente

Tengo un archivo con valores de entrada en forma de: input-prefix:value.

Necesito reemplazar input-prefixdos veces con una sustitución diferente y pasarla a un comando como my-command replace1-prefix:value replace2-prefix:value. ¿Es esto posible con un solo comando o tengo que escribirlo?

Con un valor es simple

cat my-input-file | sed 's/input-prefix/replace1-prefix/' | xargs -r my-command

TIA por cualquier ayuda,

w.

Respuesta1

Puedes agrupar partes de un patrón \(\)y luego consultarlo mediante \1(o \2... \9si tienes más grupos en un patrón):

s/input-prefix:\(.*\)/replace1-prefix:\1 replace2-prefix:\1/

Respuesta2

También es simple con múltiples valores. Primero, puede omitir el comando cat en su tubería, debido a que sed leerá el archivo e imprimirá su salida en STDOUT. Y sedfunciona de la manera que @Philippos lo describió (y \1se usará dos veces ya que pertenece al primer grupo de captura). Simplemente elimine el eco en el comando xargs para ejecutar su comando. Si desea ver el comando que se llamó, puede agregar el parámetro -tpara ver el comando o -prealizarlo de forma interactiva. Por lo tanto, debe indicar sí/no antes de ejecutar el comando.

user@pc:/tmp$ cat inputfile.txt 
input-prefix1:value1
input-prefix:value
input-prefix2:value2

user@pc:/tmp$ sed 's/^input-prefix:\(.*\)$/replace1-prefix:\1\nreplace2-prefix:\1/g' inputfile.txt
input-prefix1:value1
replace1-prefix:value
replace2-prefix:value
input-prefix2:value2 

user@pc:/tmp$ sed 's/^input-prefix:\(.*\)$/replace1-prefix:\1\nreplace2-prefix:\1/g' inputfile.txt | xargs -r echo my-command

Nota breve: esto supone que su prefijo de entrada es lo primero en la línea que desea reemplazar y el valor es el resto de la línea detrás de los dos puntos. Además, el gmodificador en el sedcomando sustituirá todas las apariciones de usted input-prefix:dentro del archivo inputfile.txt.

información relacionada