Estoy tratando de serch y reemplazar el uso de sed en Cygwin:

SRC_FOLDER_MAIN=bra
TGT_FOLDER_MAIN=tag

pero el siguiente comando sed no funciona:

sed 's/${SRC_FOLDER_MAIN}/${TGT_FOLDER_MAIN}/g' externals.txt > externals_mod.txt

Este, por ejemplo, funciona OK (reemplaza «bra» con «etiqueta»):

sed 's/bra/tag/g' externals.txt > externals_mod.txt

Lo que me estoy perdiendo?

Podría ser que Cygwin es el problema?

  • +1 por tu ejemplo, tal vez sea un error tipográfico, sin embargo, de sentido! mismo como <tag>, bra deben emparejado demasiado ^_^.
  • Emparejado? Yo no entender…?
  • es extremadamente difícil de concepto que requiere años de estudio intenso 😛 😛 😛
  • ah, ok, ya veo… va a llegar a los negocios.
  • …… justo lo olvide, si usted no lo consigue…
  • es nativa spa altavoz lo correcto… definitivamente vinculado si es posible 🙂

InformationsquelleAutor Danijel | 2013-05-07

4 Comentarios

  1. 2

    si usted necesita para pasar las variables de shell en el sed, usted necesita para llevarlos a cabo de la comilla simple
    tratar como este

    sed 's/'${SRC_FOLDER_MAIN}'/'${TGT_FOLDER_MAIN}'/g' $externals.txt > $externals_mod.txt

    aviso de la ' justo antes y después de ${SRC_FOLDER_MAIN} y similares en ${TGT_FOLDER_MAIN}

    Actualización: Ejemplo

    [[bash_prompt$]]$ cat log
    we will replace aaaa with bbbb
    [[bash_prompt$]]$ a=aaaa;b=bbbb
    [[bash_prompt$]]$ sed 's/'${a}'/'${b}'/g' log > new_log
    [[bash_prompt$]]$ cat new_log
    we will replace bbbb with bbbb
    
    • No, esto no funciona demasiado.
    • he actualizado con un ejemplo de trabajo
    • ok, así que es probablemente mi cygwin problema de configuración?
    • probablemente, en ese caso, yo no soy la persona adecuada. Mejor añadir cygwin también en su pregunta etiqueta
  2. 3

    Para hacer sed reemplazar basado en las variables de valor, se envuelve con comillas dobles y uso de variables simples llamadas, sin {}. También, es $externals*.txt correcta? Si se llama a los archivos, sólo hay que poner su nombre.

    sed "s/$SRC_FOLDER_MAIN/$TGT_FOLDER_MAIN/g" $externals.txt > $externals_mod.txt
    

    Lugar de

    sed 's/${SRC_FOLDER_MAIN}/${TGT_FOLDER_MAIN}/g' $externals.txt > $externals_mod.txt
    
    • Las comillas dobles no funcionan: sed: e-expresión #1, char 17: desconocido opción de `s’
    • Uhms, puedo ver, probar con sed "s/$SRC_FOLDER_MAIN/$TGT_FOLDER_MAIN/g" $externals.txt > $externals_mod.txt actualizada. Que es, sin {} para las variables.
    • De nuevo error: sed: e-expresión #1, char 17: desconocido opción de `s’
    • Publique el comando exacto que usted está usando. Yo no soy de añadir ningún -e ni -s.
    • sed es muy sensible en términos de lo que va a permitir que en la de buscar/reemplazar áreas, pero el texto publicado no debe producir el error que estás viendo. Modificar su pregunta con un copy/paste de su ventana para mostrar que pueblan sus variables, la ejecución de sed, y la salida de obtener por lo que podemos ver lo que REALMENTE está haciendo.
    • Ahora veo los nombres de archivo se llama con $externals.txt. Si esto no es una variable, sino un nombre de archivo, sólo hay que poner externals.txt como indicado en mi respuesta actualizada.
    • el OP dijo que la rígida sed trabajado con los nombres de archivo por lo que deben estar bien tal como está.
    • Oh, veo a @EdMorton. Respuesta actualizada de mencionarla. Gracias!
    • Lo siento, quitan $, de hecho fue ${NOMBRE}externals.txt…
    • No he añadido ninguna -e, la línea es como el anterior. No tengo idea de por qué este error se produce incluso hay no pasa en absoluto.
    • Tan básico sed "s/${SRC_FOLDER_MAIN}/${TGT_FOLDER_MAIN}/g" externals.txt > externals_mod.txt debería funcionar. Por lo menos no para mí.
    • Ahhh por qué no para mí? Todavía sed: e-expresión #1, char 17: desconocido opción de `s’
    • Me olvidé de mencionar que estoy ejecutando este script en cygwin. ¿Que importa?
    • Es posible que importa, no lo sé. Compruebe man sed para ver si usted puede encontrar algunas sugerencias. He llegado a mi límite : )

  3. 1

    Está utilizando el estándar de Windows cmd shell?

    Si es así, entonces usted necesita para envolver las variables de entorno en los signos%, así:

    sed 's/%SRC_FOLDER_MAIN%/%TGT_FOLDER_MAIN%/g' externals.txt > externals_mod.txt
    
  4. 0

    Si usted está luchando con los personajes sed aceptará en su sustitución, sólo tiene que utilizar awk:

    SRC_FOLDER_MAIN=bra
    TGT_FOLDER_MAIN=tag
    
    awk -v src="$SRC_FOLDER_MAIN" -v tgt="$TGT_FOLDER_MAIN" '{gsub(src,tgt)}1' "$externals.txt" > "$externals_mod.txt"
    

    Que trabajará con todos los caracteres en las variables. La única cosa a tener en cuenta es que, al igual que con la sed, la «fuente» será tratada como una regexp para VOLVER a metacaracteres (por ejemplo,». » o «*») será significativo – si eso es un problema, háganoslo saber, ya no es un simple awk solución, pero no equivalente sed solución.

    awk para buscar y reemplazar una cadena en lugar de un regexp:

    awk -v src="$SRC_FOLDER_MAIN" -v tgt="$TGT_FOLDER_MAIN" '
        idx = index($0,src) { $0 = substr($0,1,idx-1) tgt substr($0,idx+length(src)) }1
    ' "$externals.txt" > "$externals_mod.txt"
    

Dejar respuesta

Please enter your comment!
Please enter your name here