2010-02-16 9 views
7

estoy en el directorio con los archivos que consta de muchas líneas de líneas de este tipo:error SED - patrón sustituto sin terminar

98.684807 :(float) 
52.244898 :(float) 
46.439909 :(float) 

y luego una línea que termina:

[chuck]: cleaning up... 

Estoy tratando de eliminar :(float) de cada archivo (pero deje el número) y también elimine esa línea de limpieza ...

yo puede conseguir:

sed -ie 's/ :(float)//g' * 

a trabajar, pero que crea archivos que guarda los archivos antiguos. La eliminación del indicador -e da como resultado un error de patrón sustituto sin terminar.

Lo mismo pasa con:

sed -ie 's/[chuck]: cleaning up...//g' * 

Pensamientos?

+0

¿Qué significa "crea archivos que mantienen los archivos antiguos"? –

+0

Si tengo un archivo llamado abc. Elimina las líneas del archivo abc, pero crea un archivo llamado abce. –

+2

La 'g' no es necesaria si el patrón solo aparece una vez por línea. –

Respuesta

1
sed -i -e 's/ :(float)//g' * 
11
sed -i '' -e 's/:(float)//' -e '/^.chuck/d' * 

De esta manera usted está diciendo SED no guardar un (extensión de respaldo longitud nula a -i) copia y especificando por separado los comandos sed.

3
sed -ie expression [files...] 

es equivalente a:

sed -ie -e expression [files...] 

y ambos significan aplicar la expresión a los archivos y sobrescribir los archivos, pero el ahorro de los archivos viejos con una "e" como sufijo de respaldo.

Creo que desee: sed -i -e expresión [archivos ...]

Ahora bien, si usted está recibiendo un error de que debe haber algo mal con su expression.

3

sus números están separados por (float) por el carácter :. Por lo tanto, puedes usar awk/cut para obtener tus números. Es más simple que una expresión regular

$ head -n -1 file | awk -F":" '{print $1}' 
98.684807 
52.244898 
46.439909 

$ head -n -1 file | cut -d":" -f1 
98.684807 
52.244898 
46.439909 
1

Compruebe si tiene algún nombre de archivo extraño en el directorio.

Aquí es una manera de duplicar su error:

$ touch -- "-e s:x:" 
$ ls 
-e s:x: 
$ sed -i "s/ :(float)//g' * 
sed: -e expression #1, char 5: unterminated `s' command 

Una forma de protegerse contra esto es utilizar un guión doble de interrumpir las opciones para sed cuando se utiliza un comodín:

$ sed -i "s/ :(float)//g' -- * 

puede hacer lo mismo para eliminar el archivo:

$ rm "-e s:x:" 
rm: invalid option -- 'e' 
$ rm -- "-e s:x:" 
1

Solución:

sed -i '' 's/ :(float)//g' *

sed -i '' 's/[chuck]: cleaning up...//g' *

Explicación:

yo puede conseguir:

sed -ie 's/ :(float)//g' * 

para trabajar, pero eso crea archivos que mantienen los archivos antiguos.

Eso es porque ised bandera 's se supone que funciona de esa manera

-i extension

Edit files in-place, saving backups with the specified extension. If a zero-length extension is given, no backup will be saved.

En este caso e se interpreta como la extensión desea guardar las copias de seguridad con. Por lo tanto, se realizará una copia de seguridad de todos sus archivos originales con un e adjunto a sus nombres.

Para proporcionar una extensión de longitud cero, debe usar -i ''.

Nota: A diferencia de -i<your extension>, -i'' no funcionará. Debe tener un carácter de espacio entre -i y '' para que funcione.


Extracción de los resultados -e bandera en un error patrón sustituto sin terminación.

Cuando se quita el e inmediatamente después -i, es decir

sed -i 's/ :(float)//g' *

s/ :(float)//g ahora se interpretará como la extensión argumento para i bandera.Y el primer archivo de la lista de archivos producidos por el desarrollo del forro de * se interpreta como una sed function (muy probablemente s/regular expression/replacement/flags función) Puede verificar esto en la salida del

sedfn=$(echo * | cut -d' ' -f1); [[ ${sedfn:0:1} == "s" ]]; echo $?

Si la salida de la la cadena de comandos anterior es 0, nuestra suposición es validada.

También en este caso, si de alguna manera el primer nombre de archivo califica como una función s/regular expression/replacement/flags sed, los otros nombres de archivos se interpretarán como archivos regulares para que sed funcione.

Cuestiones relacionadas