Buscar..


Sintaxis

  • sed -I extension - FreeBSD sed (contador de linea continua)
  • sed -I [ extensión ] - NetBSD e Illumos sed (contador de línea continua)
  • extensión sed -i - FreeBSD sed
  • sed -i [ extensión ] - NetBSD, OpenBSD, Illumos, BusyBox y GNU sed
  • sed --in-place [= extension ] - Illumos, BusyBox y GNU sed

Parámetros

Parámetro Detalles
extension Guarde un archivo de respaldo con la extensión especificada, o ningún archivo de respaldo cuando la extension sea ​​una cadena de longitud cero.

Observaciones

La edición in situ es una extensión común pero no estándar presente en la mayoría de los sistemas recientes.

De un manual BSD sed

(Una sección como esta aparece en todos los manuales actuales de BSD sed , y los de sus derivados)

No se recomienda dar una extensión de longitud cero cuando esté en su lugar editando archivos, ya que se corre el riesgo de corrupción o contenido parcial en situaciones donde se agota el espacio en disco, etc.

No olvides la poderosa ed

Definitivamente, hay un uso para sed y para las funciones de edición in situ de sed , pero cuando se extiende el estándar UNIX, siempre debemos preguntarnos por qué el antiguo estándar UNIX no incluyó esa característica. Aunque UNIX no es perfecto, la ortogonalidad y la integridad de las herramientas se han desarrollado para que se encuentren cerca de la perfección, al menos para los fines que eran visibles alrededor de 1970: la edición de texto y la edición automatizada de texto seguramente eran visibles alrededor de ese tiempo.

En realidad, la idea de sed no es editar un archivo en su lugar, sino editar una secuencia . Es por eso que el nombre sed es una forma corta de editor de secuencias . Quita la s , y obtienes la herramienta que realmente fue diseñada para la edición de archivos : ed :

printf 'g/what to replace/s//with what to replace/g\nw\nq\n' | ed file

o cat file_edit_commands | ed file .

Reemplazo de cadenas en un archivo en el lugar

sed -i s/"what to replace"/"with what to replace"/g $file

Usamos -i para seleccionar la edición local en el $file file. En algunos sistemas se requiere agregar el sufijo después de la -i que se usará para crear una copia de seguridad del archivo original. Puede agregar una cadena vacía como -i '' para omitir la creación de la copia de seguridad. Mira los comentarios en este tema sobre la opción -i .

El terminador g significa hacer una búsqueda / reemplazo global en cada línea.

$ cat example 
one
two
three
total
$ sed -i s/"t"/"g"/g example 
$ cat example 
one
gwo
ghree
gogal

Uso Portátil

La edición en contexto, aunque es común, es una característica no estándar. Una alternativa viable sería utilizar un archivo intermedio para almacenar el original o la salida.

sed 'sed commands' > file.out && mv file.out file
# or
mv file file.orig && sed 'sed commands' file.orig > file

Para usar la opción -i con la sintaxis de GNU y FreeBSD, se debe especificar una extensión y adjuntarla a la opción -i . Lo siguiente será aceptado por ambos, y producirá dos archivos, la versión original en file.orig y la versión editada en el file :

sed -i.orig 'sed commands' file

Ver un ejemplo básico dado un archivo de file :

$ cat file
one
two
three
$ sed -i.orig 's/one/XX/' file
$ cat file                       # the original file has changed its content
XX
two
three
$ cat file.orig                  # the original content is now in file.orig
one
two
three

Un ejemplo más complejo, reemplazando cada línea con un número de línea:

$ printf 'one\ntwo\n' | tee file1 | tr a-z A-Z > file2
$ sed -ni.orig = file1 file2
$ cat file1.orig file2.orig
one
two
ONE
TWO
$ cat file1 file2
1
2
1
2

¿Por qué se requiere un archivo de copia de seguridad?

Para utilizar la edición in situ sin un archivo de copia de seguridad, -i se debe dar un argumento de longitud cero y FreeBSD sed requiere un argumento a -i , ya sea anexado o por separado, mientras que la extensión argumento opcional GNU requiere el argumento se anexará a -i Ambos admiten la adición del argumento a -i , pero sin que sea necesario -i'' command es indistinguible de la -i extension , por lo que no se puede agregar un argumento de longitud cero a -i .

La edición en contexto sin especificar un archivo de copia de seguridad anula los permisos de solo lectura

sed -i -e cmd file modificará el file incluso si sus permisos están configurados como de solo lectura.

Este comando se comporta de manera similar a

sed -e cmd file > tmp; mv -f tmp file

más bien que

sed -e cmd file > tmp; cat tmp > file; rm tmp

El siguiente ejemplo usa gnu sed :

$ echo 'Extremely important data' > input
$ chmod 400 input  # Protect that data by removing write access
$ echo 'data destroyed' > input
-bash: input: Permission denied
$ cat input  
Extremely important data (#phew! Data is intact)
$ sed -i s/important/destroyed/ input
$ cat input
Extremely destroyed data (#see, data changed)

Esto se puede mitigar creando una copia de seguridad especificando un SUFFIX con la opción i :

$ sed -i.bak s/important/destroyed/ input
$ cat input
Extremely destroyed data
$ cat input.bak
Extremely important data


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow