{"id":923,"date":"2023-11-02T13:22:06","date_gmt":"2023-11-02T11:22:06","guid":{"rendered":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/?page_id=923"},"modified":"2025-04-25T18:06:30","modified_gmt":"2025-04-25T16:06:30","slug":"edicion-de-archivos-con-el-editor-de-flujo-sed-stream-editor","status":"publish","type":"page","link":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/edicion-de-archivos-con-el-editor-de-flujo-sed-stream-editor\/","title":{"rendered":"1.9.3. Edici\u00f3n de archivos con el editor de flujo <em>sed<\/em> (<em>stream editor<\/em>)"},"content":{"rendered":"<p>El nombre del comando <code>sed<\/code> proviene de<em> stream editor<\/em> (\u2018editor de flujo\u2019). Aqu\u00ed, <em>stream<\/em> se refiere a los datos que se pasan mediante tuber\u00edas de <em>shell<\/em>. Por lo tanto, la funcionalidad principal del comando es actuar como un editor de texto para los datos de entrada de la entrada est\u00e1ndar (<em>stdin<\/em>), con la salida est\u00e1ndar (<em>stdout<\/em>) como el destino de salida. Tambi\u00e9n pod\u00e9is editar la entrada de un archivo y guardar los cambios en el mismo archivo si es necesario.<\/p>\n<p>La sintaxis b\u00e1sica de <code>sed<\/code> es\u00a0 <code>sed [options] {commands} {input-file}<\/code><\/p>\n<p>La manera de trabajar de <code>sed<\/code> es la siguiente. El comando <em>sed<\/em> lee la primera l\u00ednea del {archivo-de-entrada} y ejecuta los {comandos} en la primera l\u00ednea. Luego lee la segunda l\u00ednea del {archivo-de-entrada} y ejecuta los {comandos} en la segunda l\u00ednea. El comando <code>sed<\/code> repite este proceso hasta que llega al final del {archivo-de-entrada}.<\/p>\n<p>Editad con <em>vi<\/em> el fichero <em>test.bed<\/em> y realizad cada una de las operaciones que se muestran a continuaci\u00f3n para entender la potencia del comando <em>sed<\/em>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ cat test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr1 100 200\r\n\r\nchr1 300 500\r\n\r\nchr2 240 440\r\n\r\nchr2 400 600\r\n\r\nchr3 0 150<\/pre>\n<p><strong><em>\u00a0<\/em>Sustituci\u00f3n<\/strong><\/p>\n<p><em>\u00a0<\/em># Sustituye todos los <em>strings<\/em> que coincidan con <em>chr1 <\/em>por <em>chr2<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed 's\/chr1\/chr2\/' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr2 100 200\r\n\r\nchr2 300 500\r\n\r\nchr2 240 440\r\n\r\nchr2 400 600\r\n\r\nchr3 0 150\r\n<\/pre>\n<p># Sustituye todos los <em>strings<\/em> que coincidan con <em>chr1<\/em> por <em>chr2<\/em> solo si la l\u00ednea contiene 300<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$sed '\/300\/s\/chr1\/chr2\/' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr1 100 200\r\n\r\nchr2 300 500\r\n\r\nchr2 240 440\r\n\r\nchr2 400 600\r\n\r\nchr3 0 150<\/pre>\n<p># Sustituye todos los <em>strings<\/em> que coincidan con <em>chr1<\/em> por <em>chr2<\/em> solo si la l\u00ednea no contiene 300<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$sed '\/300\/! s\/chr1\/chr2\/' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr2 100 200\r\n\r\nchr1 300 500\r\n\r\nchr2 240 440\r\n\r\nchr2 400 600\r\n\r\nchr3 0 150<\/pre>\n<p># Reemplaza todos los <em>strings<\/em> que coincidan con <em>chr<\/em> si son los primeros caracteres de la l\u00ednea<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed 's\/^chr\/\/' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">1 100 200\r\n\r\n1 300 500\r\n\r\n2 240 440\r\n\r\n2 400 600\r\n\r\n3 0 150<\/pre>\n<p># Sustituye la primera ocurrencia en cada una de las l\u00edneas<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed 's\/00\/55\/' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr1 155 200\r\n\r\nchr1 355 500\r\n\r\nchr2 240 440\r\n\r\nchr2 455 600\r\n\r\nchr3 0 150<\/pre>\n<p># Sustituye todas las ocurrencias que coincidan en el patr\u00f3n<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed 's\/00\/55\/g' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr1 155 255\r\n\r\nchr1 355 555\r\n\r\nchr2 240 440\r\n\r\nchr2 455 655\r\n\r\nchr3 0 150<\/pre>\n<p># Imprime la l\u00ednea donde coincida la sustituci\u00f3n<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed -n 's\/00\/55\/p' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr1 155\u00a0 200\r\n\r\nchr1 355\u00a0 500\r\n\r\nchr2 455\u00a0 600<\/pre>\n<p># Se pueden realizar sustituciones con diferentes <em>flags<\/em> simult\u00e1neamente<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed -n 's\/00\/55\/pg' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr1 155\u00a0 255\r\n\r\nchr1 355\u00a0 555\r\n\r\nchr2 455\u00a0 655\r\n\r\n<\/pre>\n<p><strong>Eliminar<\/strong><\/p>\n<p># Elimina la segunda l\u00ednea del fichero<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed '2 d' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr1 100 200\r\n\r\nchr2 240 440\r\n\r\nchr2 400 600\r\n\r\nchr3 0 150<\/pre>\n<p># Elimina de la l\u00ednea 2 a la 4<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed '2,4 d' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr1 100 200\r\n\r\nchr3 0 150<\/pre>\n<p># Elimina desde que encuentres el <em>string<\/em> <em>chr1<\/em> a la l\u00ednea 4<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed '\/chr1\/, 4 d' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr3 0 150<\/pre>\n<p># Elimina desde la primera l\u00ednea que encuentres con <em>chr1<\/em> hasta la primera vez que encuentres <em>chr2<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed '\/chr1\/, \/chr2\/ d' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr2 400 600\r\n\r\nchr3 0 150<\/pre>\n<p><strong>Edici\u00f3n impl\u00edcita<\/strong><\/p>\n<p>El fichero de entrada y de salida es el mismo. Hazlo cuando est\u00e9s seguro del cambio.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed -i 's\/00\/55\/g' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ cat test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr1 155 255\r\n\r\nchr1 355 555\r\n\r\nchr2 240 440\r\n\r\nchr2 455 655\r\n\r\nchr3 0 150<\/pre>\n<p>\u00a1Porque el fichero original ha cambiado!<\/p>\n<p><strong>Sustituciones <em>regexp<\/em><\/strong><\/p>\n<p>Las expresiones regulares son muy \u00fatiles, y vale la pena tomarse el tiempo para aprender los conceptos b\u00e1sicos. Se pueden ampliar conocimientos utilizando herramientas en l\u00ednea para construir y probar expresiones regulares (por ejemplo, <a href=\"https:\/\/regex101.com\/\" target=\"_blank\" rel=\"noopener\">https:\/\/regex101.com\/<\/a> A continuaci\u00f3n se enumeran algunas de las importantes:<\/p>\n<p>Anclas:<\/p>\n<p><code>^<\/code> restringe la coincidencia al inicio de la cadena.<\/p>\n<p><code>$<\/code> restringe la coincidencia al final de la cadena.<\/p>\n<p><strong>Metacaracteres y cuantificadores<\/strong><\/p>\n<ul>\n<li><code>.<\/code> coincide con cualquier car\u00e1cter, incluyendo el car\u00e1cter de nueva l\u00ednea.<\/li>\n<li><code>?<\/code> coincide 0 o 1 vez.<\/li>\n<li><code>*<\/code> coincide 0 o m\u00e1s veces.<\/li>\n<li><code>+<\/code> coincide 1 o m\u00e1s veces.<\/li>\n<li><code>{m,n}<\/code> coincide de <em>m<\/em> a <em>n <\/em>veces.<\/li>\n<li><code>{m,}<\/code> coincide al menos <em>m <\/em>veces.<\/li>\n<li><code>{,n}<\/code> coincide hasta <em>n<\/em> veces (incluyendo 0 veces).<\/li>\n<li><code>{n}<\/code> coincide exactamente <em>n.<\/em><\/li>\n<\/ul>\n<p>Clases de caracteres:<\/p>\n<ul>\n<li><code>[set123]<\/code> coincide con cualquiera de estos caracteres una vez.<\/li>\n<li><code>[^set123]<\/code> coincide excepto con cualquiera de estos caracteres una vez.<\/li>\n<li><code>[3-7AM-X]<\/code> rango de caracteres desde 3 hasta 7, A, otro rango desde M hasta X.<\/li>\n<li><code>[[:digit:]]<\/code> similar a <code>[0-9] [[:alnum:]_]<\/code> similar a <code>\\w<\/code><\/li>\n<\/ul>\n<p># Elimina la primera columna: . define cualquier car\u00e1cter despu\u00e9s de <em>chr<\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed 's\/^chr.\/\/' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">  \u00a0 \u00a0 100\u00a0 200\r\n\r\n\u00a0 \u00a0 \u00a0 300\u00a0 500\r\n\r\n\u00a0 \u00a0 \u00a0 240\u00a0 440\r\n\r\n  \u00a0 \u00a0 400\u00a0 600\r\n\r\n  \u00a0   0\u00a0\u00a0\u00a0 150<\/pre>\n<p># Elimina todos los ceros presentes en el fichero<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed 's\/0*\/\/g' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr1 1\u00a0\u00a0\u00a0 2\r\n\r\nchr1 3\u00a0\u00a0\u00a0 5\r\n\r\nchr2 24\u00a0\u00a0 44\r\n\r\nchr2 4\u00a0\u00a0\u00a0 6\r\n\r\nchr3\u00a0\u00a0\u00a0\u00a0\u00a0 15<\/pre>\n<p># Elimina todos los n\u00fameros entre el 1 y el 3<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$sed 's\/[1-3]\/\/g' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr\u00a0 00\u00a0\u00a0 00\r\n\r\nchr\u00a0 00\u00a0\u00a0 500\r\n\r\nchr\u00a0 40\u00a0\u00a0 440\r\n\r\nchr\u00a0 400\u00a0 600\r\n\r\nchr\u00a0 0\u00a0\u00a0\u00a0 50<\/pre>\n<p># Sustituye el <em>string<\/em> <em>ch<\/em> por nada<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$sed 's\/[cr]\/\/g' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">h1\u00a0\u00a0 100\u00a0 200\r\n\r\nh1\u00a0\u00a0 300\u00a0 500\r\n\r\nh2\u00a0\u00a0 240\u00a0 440\r\n\r\nh2\u00a0\u00a0 400\u00a0 600\r\n\r\nh3\u00a0\u00a0 0\u00a0\u00a0\u00a0 150<\/pre>\n<p># Sustituye cualquier letra entre la <em>a<\/em> y la <em>z<\/em> por nada<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$sed 's\/[a-z]\/\/g' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">1\u00a0\u00a0\u00a0 100\u00a0 200\r\n\r\n1\u00a0\u00a0\u00a0 300\u00a0 500\r\n\r\n2\u00a0\u00a0\u00a0 240\u00a0 440\r\n\r\n2\u00a0\u00a0\u00a0 400\u00a0 600\r\n\r\n3\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0 150\r\n\r\n<\/pre>\n<p># sustituye por la cadena que coincide con el patr\u00f3n<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed 's\/^chr[0-9]\/[&amp;]\/' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">[chr1] 100 200\r\n\r\n[chr1] 300 500\r\n\r\n[chr2] 240 440\r\n\r\n[chr2] 400 600\r\n\r\n[chr3] 0 150\r\n\r\n<\/pre>\n<p># Sustituye todas las ocurrencias que encajan en el patr\u00f3n y escribe al final de la l\u00ednea <code>'+'<\/code><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed 's\/00\/55\/g ; s\/$\/\\+\/' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr1 155 255 +\r\n\r\nchr1 355 555 +\r\n\r\nchr2 240 440 +\r\n\r\nchr2 455 655 +\r\n\r\nchr3 0 150 +\r\n\r\n<\/pre>\n<p># Sustituye la ocurrencia que coincide exactamente con 2 ceros<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed 's\/0\\{2\\}\/match\/g' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr1 1match\u00a0\u00a0\u00a0 2match\r\n\r\nchr1 3match\u00a0\u00a0\u00a0 5match\r\n\r\nchr2 240\u00a0 440\r\n\r\nchr2 4match\u00a0\u00a0\u00a0 6match\r\n\r\nchr3 0\u00a0\u00a0\u00a0 150<\/pre>\n<p># Sustituye la ocurrencia que coincide con 1 o 2 ceros<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ sed 's\/0\\{1,2\\}\/match\/g' test.bed<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr1 1match\u00a0\u00a0\u00a0 2match\r\n\r\nchr1 3match\u00a0\u00a0\u00a0 5match\r\n\r\nchr2 24match\u00a0\u00a0 44match\r\n\r\nchr2 4match\u00a0\u00a0\u00a0 6match\r\n\r\nchr3 match 15match\r\n\r\n<\/pre>\n<p># Elimina todas las l\u00edneas en blanco del fichero<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">sed '\/^$\/ d' text.bed or sed '\/^#\/ d' test.bed<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>El nombre del comando sed proviene de stream editor (\u2018editor de flujo\u2019). Aqu\u00ed, stream se refiere a los datos que se pasan mediante tuber\u00edas de shell. Por lo tanto, la funcionalidad principal del comando es actuar como un editor de texto para los datos de entrada de la entrada est\u00e1ndar (stdin), con la salida est\u00e1ndar [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"_links":{"self":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/pages\/923"}],"collection":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/comments?post=923"}],"version-history":[{"count":10,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/pages\/923\/revisions"}],"predecessor-version":[{"id":1361,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/pages\/923\/revisions\/1361"}],"wp:attachment":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/media?parent=923"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}