{"id":914,"date":"2023-11-02T13:16:29","date_gmt":"2023-11-02T11:16:29","guid":{"rendered":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/?page_id=914"},"modified":"2025-04-25T18:04:23","modified_gmt":"2025-04-25T16:04:23","slug":"1-9-3-edicio-darxius-amb-leditor-de-flux-sed-stream-editor","status":"publish","type":"page","link":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/1-9-3-edicio-darxius-amb-leditor-de-flux-sed-stream-editor\/","title":{"rendered":"1.9.3. Edici\u00f3 d\u2019arxius amb l\u2019editor de flux <em>sed<\/em> (<em>stream editor<\/em>)"},"content":{"rendered":"<p>El nom de l\u2019ordre <code>sed<\/code> prov\u00e9 de<em> stream editor<\/em> (\u2018editor de flux\u2019). Aqu\u00ed, <em>stream<\/em> es refereix a les dades que es passen mitjan\u00e7ant tubs de <em>shell<\/em>. Per tant, la funcionalitat principal de l\u2019ordre \u00e9s actuar com un editor de text per a les dades d\u2019entrada de l\u2019entrada est\u00e0ndard (<em>stdin<\/em>), amb la sortida est\u00e0ndard (<em>stdout<\/em>) com el dest\u00ed de sortida. Tamb\u00e9 podem editar l\u2019entrada d\u2019un arxiu i guardar els canvis en el mateix arxiu si \u00e9s necessari.<\/p>\n<p>La sintaxi b\u00e0sica de <code>sed<\/code> \u00e9s <code>sed [options] {commands} {input-file}<\/code><\/p>\n<p>La manera de treballar de <code>sed<\/code> \u00e9s la seg\u00fcent: l\u2019ordre <em>sed<\/em> llegeix la primera l\u00ednia de l\u2019{arxiu-de-entrada} i executa les {ordres} a la primera l\u00ednia. Despr\u00e9s llegeix la segona l\u00ednia de l\u2019{arxiu-de-entrada} i executa les {ordres} a la segona l\u00ednia. L\u2019ordre <code>sed<\/code> repeteix aquest proc\u00e9s fins que arriba al final de l\u2019{arxiu-de-entrada}.<\/p>\n<p>Editeu amb <em>vi<\/em> el fitxer <em>test.bed<\/em> i realitzeu cadascuna de les operacions que es mostren a continuaci\u00f3 per entendre la pot\u00e8ncia de l\u2019ordre <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\nchr1 300 500\r\nchr2 240 440\r\nchr2 400 600\r\nchr3 0 150<\/pre>\n<p>Alternativa:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr1 100 200<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr1 300 500<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr2 240 440<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr2 400 600<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">chr3 0 150<\/pre>\n<p><strong>Substituci\u00f3<\/strong><\/p>\n<p># Substitueix tots els <em>strings<\/em> que coincideixen amb <em>chr1 <\/em>per <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\nchr2 300 500\r\nchr2 240 440\r\nchr2 400 600\r\nchr3 0 150\r\n<\/pre>\n<p># Substitueix tots els <em>strings<\/em> que coincideixen amb<em> chr1<\/em> per <em>chr2<\/em> nom\u00e9s si la l\u00ednia cont\u00e9 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\nchr2 300 500 \r\nchr2 240 440 \r\nchr2 400 600 \r\nchr3 0 150<\/pre>\n<p># Substitueix tots els <em>strings<\/em> que coincideixen amb <em>chr1<\/em> per <em>chr2<\/em> nom\u00e9s si la l\u00ednia no cont\u00e9 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 chr1 300 500 chr2 240 440 chr2 400 600 chr3 0 150<\/pre>\n<p># Reempla\u00e7a tots els <em>strings<\/em> que coincideixen amb <em>chr<\/em> si s\u00f3n els primers car\u00e0cters de la l\u00ednia<\/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># Substitueix la primera ocurr\u00e8ncia en cadascuna de les l\u00ednies<\/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># Substitueix totes les ocurr\u00e8ncies que coincideixin en el patr\u00f3<\/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># Imprimeix la l\u00ednia on coincideix la substituci\u00f3<\/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># Es poden realitzar substitucions amb diferents <em>flags<\/em> simult\u00e0niament<\/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 segona l\u00ednia del fitxer<\/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 des de l\u2019<em>string<\/em><em> chr1<\/em> a la l\u00ednia 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 des de la primera l\u00ednia que troba amb <em>chr1<\/em> fins a la primera vegada que troba <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\u00f3 impl\u00edcita<\/strong><\/p>\n<p>El fitxer d\u2019entrada i de sortida \u00e9s el mateix. Feu-lo quan estiguis segur del canvi.<\/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>Perqu\u00e8 el fitxer original ha canviat!<\/p>\n<p><strong>Substitucions <em>regexp<\/em><\/strong><\/p>\n<p>Les expressions regulars s\u00f3n molt \u00fatils, i val la pena dedicar el temps per aprendre els conceptes b\u00e0sics. Es poden ampliar coneixements utilitzant eines en l\u00ednia per construir i provar expressions regulars (per exemple, <a href=\"https:\/\/regex101.com\/\" target=\"_blank\" rel=\"noopener\">https:\/\/regex101.com\/<\/a>). A continuaci\u00f3 enumerem algunes de les importants:<\/p>\n<p>\u00c0ncores:<\/p>\n<p><code>^<\/code> restringeix la coincid\u00e8ncia a l\u2019inici de la cadena.<\/p>\n<p><code>$<\/code> restringeix la coincid\u00e8ncia al final de la cadena.<\/p>\n<p><strong><span lang=\"CA\">Metacar\u00e0cters i quantificadors<\/span><\/strong><\/p>\n<ul>\n<li><code>.<\/code> coincideix amb qualsevol car\u00e0cter, incloent-hi el car\u00e0cter de nova l\u00ednia.<\/li>\n<li><code>?<\/code> coincideix 0 o 1 vegada.<\/li>\n<li><code>*<\/code> coincideix 0 o m\u00e9s vegades.<\/li>\n<li><code>+<\/code>coincideix 1 o m\u00e9s vegades.<\/li>\n<li><code>{m,n}<\/code> coincideix de <em>m<\/em> a <em>n<\/em> vegades.<\/li>\n<li><code>{m,}<\/code> coincideix almenys <em>m<\/em> vegades.<\/li>\n<li><code>{,n}<\/code> coincideix fins a<em> n<\/em> (incloent-hi 0 vegades).<\/li>\n<li><code>{n}<\/code> coincideix exactament <em>n<\/em>.<\/li>\n<\/ul>\n<p>Classes de car\u00e0cters:<\/p>\n<ul>\n<li><code>[set123]<\/code> coincideix amb qualsevol d\u2019aquests car\u00e0cters una vegada.<\/li>\n<li><code>[^set123]<\/code> coincideix excepte amb qualsevol d\u2019aquests car\u00e0cters una vegada.<\/li>\n<li><code>[3-7AM-X]<\/code> rang de car\u00e0cters des de 3 fins a 7, A, un altre rang des de M fins a X.<\/li>\n<li><code>[[:digit:]]<\/code> similar a <code>[0-9] [[:alnum:]_]<\/code> semblant a <code>\\w<\/code><\/li>\n<\/ul>\n<p># Elimina la primera columna: . defineix qualsevol car\u00e0cter despr\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 tots els zeros presents al fitxer<\/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 tots els n\u00fameros entre l\u20191 i 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># Substitueix l\u2019<em>string ch<\/em> per res<\/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># S\u2019utilitza qualsevol lletra entre la <em>a<\/em> i la <em>z<\/em> per res<\/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># Substitueix per la cadena que coincideix amb el patr\u00f3<\/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># Substitueix totes les ocurr\u00e8ncies que encaixen en el patr\u00f3 i escriu al final de la l\u00ednia <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># Substitueix l\u2019ocurr\u00e8ncia que coincideix exactament amb 2 zeros<\/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># Substitueix l\u2019ocurr\u00e8ncia que coincideix amb 1 o 2 zeros<\/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<\/pre>\n<p># Elimina totes les l\u00ednies en blanc del fitxer<\/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 nom de l\u2019ordre sed prov\u00e9 de stream editor (\u2018editor de flux\u2019). Aqu\u00ed, stream es refereix a les dades que es passen mitjan\u00e7ant tubs de shell. Per tant, la funcionalitat principal de l\u2019ordre \u00e9s actuar com un editor de text per a les dades d\u2019entrada de l\u2019entrada est\u00e0ndard (stdin), amb la sortida est\u00e0ndard (stdout) com [&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\/wp-json\/wp\/v2\/pages\/914"}],"collection":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/comments?post=914"}],"version-history":[{"count":22,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/pages\/914\/revisions"}],"predecessor-version":[{"id":1360,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/pages\/914\/revisions\/1360"}],"wp:attachment":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/media?parent=914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}