examples path sed csh

path - examples - seed command in linux



¿Cómo reemplazar un camino con otro camino en sed? (5)

El uso de csh para scripting serio generalmente no se recomienda . Sin embargo, eso es tangencial al problema en cuestión.

Probablemente estés buscando algo como esto:

sed -e "s=$oldpath=$newpath="

donde la variable de shell $oldpath contiene el valor que se reemplazará y $newpath contiene la sustitución, y se supone que ninguna de las variables contiene un signo igual. Es decir, puede elegir el delimitador en el patrón y evitar el delimitador habitual evita problemas con barras en nombres de ruta. Si cree que = puede aparecer en los nombres de sus archivos, elija algo con menos probabilidades de aparecer, como control-A o control-G.

Tengo un script csh (aunque puedo cambiar los idiomas si tiene alguna relevancia) donde tengo que:

sed s/AAA/BBB/ file

El problema es que AAA y BBB son rutas, y entonces contienen ''/''. AAA es fijo, entonces puedo decir:

sed s/////A////A///A/BBB/ file

Sin embargo, BBB se basa en variables, incluyendo $ PWD. ¿Cómo escapo de ''/'' en $ PWD?

O ¿hay alguna otra forma en que debería estar haciendo esto por completo?


En circunstancias en las que la cadena de reemplazo o la cadena de patrones contengan barras diagonales, puede utilizar el hecho de que GNU sed permite un delimitador alternativo para el comando sustituto. Las opciones comunes para el delimitador son el carácter de la tubería | o el hash # - la mejor elección del carácter delimitador a menudo dependerá del tipo de archivo que se esté procesando. En tu caso, puedes probar

sed -i ''s#/path/to/AAA#/path/to/BBB#g'' your_file

Nota: La g después del último # es para cambiar todas las ocurrencias en el archivo si desea cambiar primero la opacidad no use g


Puede usar la expansión de paréntesis ${i/p/r} para escapar de las barras diagonales. En este caso ${i//p/r} para escapar de todas las ocurrencias.

$p1=${p1////////} $p2=${p2////////} sed s/$p1/$p2/ file

O, más conciso, en una línea sed s/${p1////////}/${p2////////}/ file

Las dos primeras barras // son un separador en expansión entre paréntesis que dice que estamos haciendo coincidir todas las ocurrencias, luego // es para escapar de la barra en la plantilla de búsqueda, / como segundo separador en la expansión, y luego /// es el reemplazo , en el cual la barra invertida debe ser escapada.


sed puede usar cualquier separador en lugar de / en el comando s . Solo usa algo que no se encuentra en tus rutas:

s+AAA+BBB+

y así.

Alternativamente (y si no quieres adivinar), puedes preprocesar tu ruta con sed para escapar de las barras inclinadas:

pwdesc=$(echo $PWD | sed ''s_/_///_g'')

y luego haz lo que necesites con $pwdesc .


sed -i "s|$fileWithPath|HAHA|g" file