bash-hackers-wiki/howto/edit-ed/index.html

131 lines
66 KiB
HTML

<!doctype html><html lang=en class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link href=https://flokoe.github.io/bash-hackers-wiki/howto/edit-ed/ rel=canonical><link href=../dissectabadoneliner/ rel=prev><link href=../getopts_tutorial/ rel=next><link rel=icon href=../../assets/images/favicon.png><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.5.44"><title>Editing files via scripts with ed - The Bash Hackers Wiki</title><link rel=stylesheet href=../../assets/stylesheets/main.0253249f.min.css><link rel=stylesheet href=../../assets/stylesheets/palette.06af60db.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script></head> <body dir=ltr data-md-color-scheme=default data-md-color-primary=indigo data-md-color-accent=indigo> <input class=md-toggle data-md-toggle=drawer type=checkbox id=__drawer autocomplete=off> <input class=md-toggle data-md-toggle=search type=checkbox id=__search autocomplete=off> <label class=md-overlay for=__drawer></label> <div data-md-component=skip> <a href=#editing-files-via-scripts-with-ed class=md-skip> Skip to content </a> </div> <div data-md-component=announce> </div> <header class=md-header data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Header> <a href=../.. title="The Bash Hackers Wiki" class="md-header__button md-logo" aria-label="The Bash Hackers Wiki" data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg> </a> <label class="md-header__button md-icon" for=__drawer> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> </label> <div class=md-header__title data-md-component=header-title> <div class=md-header__ellipsis> <div class=md-header__topic> <span class=md-ellipsis> The Bash Hackers Wiki </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Editing files via scripts with ed </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media data-md-color-scheme=default data-md-color-primary=indigo data-md-color-accent=indigo aria-label="Switch to dark mode" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Switch to dark mode" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> </label> <input class=md-option data-md-color-media data-md-color-scheme=slate data-md-color-primary=indigo data-md-color-accent=indigo aria-label="Switch to light mode" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Switch to light mode" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> </label> </form> <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> <label class="md-header__button md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> </label> <div class=md-search data-md-component=search role=dialog> <label class=md-search__overlay for=__search></label> <div class=md-search__inner role=search> <form class=md-search__form name=search> <input type=text class=md-search__input name=query aria-label=Search placeholder=Search autocapitalize=off autocorrect=off autocomplete=off spellcheck=false data-md-component=search-query required> <label class="md-search__icon md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> </label> <nav class=md-search__options aria-label=Search> <button type=reset class="md-search__icon md-icon" title=Clear aria-label=Clear tabindex=-1> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> </button> </nav> <div class=md-search__suggest data-md-component=search-suggest></div> </form> <div class=md-search__output> <div class=md-search__scrollwrap tabindex=0 data-md-scrollfix> <div class=md-search-result data-md-component=search-result> <div class=md-search-result__meta> Initializing search </div> <ol class=md-search-result__list role=presentation></ol> </div> </div> </div> </div> </div> <div class=md-header__source> <a href=https://github.com/flokoe/bash-hackers-wiki title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 496 512"><!-- Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </div> <div class=md-source__repository> flokoe/bash-hackers-wiki </div> </a> </div> </nav> </header> <div class=md-container data-md-component=container> <nav class=md-tabs aria-label=Tabs data-md-component=tabs> <div class=md-grid> <ul class=md-tabs__list> <li class=md-tabs__item> <a href=../.. class=md-tabs__link> Start </a> </li> <li class=md-tabs__item> <a href=../../commands/classictest/ class=md-tabs__link> Commands </a> </li> <li class=md-tabs__item> <a href=../../dict/directory/ class=md-tabs__link> Dict </a> </li> <li class="md-tabs__item md-tabs__item--active"> <a href=../calculate-dc/ class=md-tabs__link> Howto </a> </li> <li class=md-tabs__item> <a href=../../internals/shell_options/ class=md-tabs__link> Internals </a> </li> <li class=md-tabs__item> <a href=../../misc/bashphorisms/ class=md-tabs__link> Misc </a> </li> <li class=md-tabs__item> <a href=../../scripting/bashbehaviour/ class=md-tabs__link> Scripting </a> </li> <li class=md-tabs__item> <a href=../../snipplets/ class=md-tabs__link> Snipplets </a> </li> <li class=md-tabs__item> <a href=../../syntax/arith_expr/ class=md-tabs__link> Syntax </a> </li> <li class=md-tabs__item> <a href=../../tags/ class=md-tabs__link> Tags </a> </li> </ul> </div> </nav> <main class=md-main data-md-component=main> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component=sidebar data-md-type=navigation> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--primary md-nav--lifted" aria-label=Navigation data-md-level=0> <label class=md-nav__title for=__drawer> <a href=../.. title="The Bash Hackers Wiki" class="md-nav__button md-logo" aria-label="The Bash Hackers Wiki" data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg> </a> The Bash Hackers Wiki </label> <div class=md-nav__source> <a href=https://github.com/flokoe/bash-hackers-wiki title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 496 512"><!-- Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </div> <div class=md-source__repository> flokoe/bash-hackers-wiki </div> </a> </div> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../.. class=md-nav__link> <span class=md-ellipsis> Start </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2> <label class=md-nav__link for=__nav_2 id=__nav_2_label tabindex=0> <span class=md-ellipsis> Commands </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_2_label aria-expanded=false> <label class=md-nav__title for=__nav_2> <span class="md-nav__icon md-icon"></span> Commands </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../commands/classictest/ class=md-nav__link> <span class=md-ellipsis> The classic test command </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_2_2> <label class=md-nav__link for=__nav_2_2 id=__nav_2_2_label tabindex=0> <span class=md-ellipsis> Builtin </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_2_2_label aria-expanded=false> <label class=md-nav__title for=__nav_2_2> <span class="md-nav__icon md-icon"></span> Builtin </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../commands/builtin/caller/ class=md-nav__link> <span class=md-ellipsis> The caller builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/cd/ class=md-nav__link> <span class=md-ellipsis> The cd builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/declare/ class=md-nav__link> <span class=md-ellipsis> The declare builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/echo/ class=md-nav__link> <span class=md-ellipsis> The echo builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/eval/ class=md-nav__link> <span class=md-ellipsis> The eval builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/exec/ class=md-nav__link> <span class=md-ellipsis> The exec builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/exit/ class=md-nav__link> <span class=md-ellipsis> The exit builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/export/ class=md-nav__link> <span class=md-ellipsis> The export builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/kill/ class=md-nav__link> <span class=md-ellipsis> The kill builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/let/ class=md-nav__link> <span class=md-ellipsis> The let builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/local/ class=md-nav__link> <span class=md-ellipsis> The local builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/mapfile/ class=md-nav__link> <span class=md-ellipsis> The mapfile builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/printf/ class=md-nav__link> <span class=md-ellipsis> The printf command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/read/ class=md-nav__link> <span class=md-ellipsis> The read builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/readonly/ class=md-nav__link> <span class=md-ellipsis> The readonly builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/return/ class=md-nav__link> <span class=md-ellipsis> The return builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/set/ class=md-nav__link> <span class=md-ellipsis> The set builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/shift/ class=md-nav__link> <span class=md-ellipsis> The shift builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/shopt/ class=md-nav__link> <span class=md-ellipsis> The shopt builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/trap/ class=md-nav__link> <span class=md-ellipsis> The trap builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/unset/ class=md-nav__link> <span class=md-ellipsis> The unset builtin command </span> </a> </li> <li class=md-nav__item> <a href=../../commands/builtin/wait/ class=md-nav__link> <span class=md-ellipsis> The wait builtin command </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_3> <label class=md-nav__link for=__nav_3 id=__nav_3_label tabindex=0> <span class=md-ellipsis> Dict </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_3_label aria-expanded=false> <label class=md-nav__title for=__nav_3> <span class="md-nav__icon md-icon"></span> Dict </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../dict/directory/ class=md-nav__link> <span class=md-ellipsis> Directory </span> </a> </li> <li class=md-nav__item> <a href=../../dict/end_of_options/ class=md-nav__link> <span class=md-ellipsis> End of Options </span> </a> </li> <li class=md-nav__item> <a href=../../dict/exit_status/ class=md-nav__link> <span class=md-ellipsis> Exit Status </span> </a> </li> <li class=md-nav__item> <a href=../../dict/file/ class=md-nav__link> <span class=md-ellipsis> File </span> </a> </li> <li class=md-nav__item> <a href=../../dict/filetimes/ class=md-nav__link> <span class=md-ellipsis> File timestamp </span> </a> </li> <li class=md-nav__item> <a href=../../dict/globbing/ class=md-nav__link> <span class=md-ellipsis> Globbing </span> </a> </li> <li class=md-nav__item> <a href=../../dict/hardlink/ class=md-nav__link> <span class=md-ellipsis> Hardlink </span> </a> </li> <li class=md-nav__item> <a href=../../dict/interpreter_directive/ class=md-nav__link> <span class=md-ellipsis> Interpreter Directive </span> </a> </li> <li class=md-nav__item> <a href=../../dict/parameter/ class=md-nav__link> <span class=md-ellipsis> Parameter </span> </a> </li> <li class=md-nav__item> <a href=../../dict/posix/ class=md-nav__link> <span class=md-ellipsis> POSIX </span> </a> </li> <li class=md-nav__item> <a href=../../dict/shell/ class=md-nav__link> <span class=md-ellipsis> Shell </span> </a> </li> <li class=md-nav__item> <a href=../../dict/special_file/ class=md-nav__link> <span class=md-ellipsis> Special file </span> </a> </li> <li class=md-nav__item> <a href=../../dict/symlink/ class=md-nav__link> <span class=md-ellipsis> Symlink </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_4 checked> <label class=md-nav__link for=__nav_4 id=__nav_4_label tabindex> <span class=md-ellipsis> Howto </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_4_label aria-expanded=true> <label class=md-nav__title for=__nav_4> <span class="md-nav__icon md-icon"></span> Howto </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../calculate-dc/ class=md-nav__link> <span class=md-ellipsis> Calculating with dc </span> </a> </li> <li class=md-nav__item> <a href=../collapsing_functions/ class=md-nav__link> <span class=md-ellipsis> Collapsing Functions </span> </a> </li> <li class=md-nav__item> <a href=../conffile/ class=md-nav__link> <span class=md-ellipsis> Config files for your script </span> </a> </li> <li class=md-nav__item> <a href=../dissectabadoneliner/ class=md-nav__link> <span class=md-ellipsis> Dissect a bad oneliner </span> </a> </li> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" type=checkbox id=__toc> <label class="md-nav__link md-nav__link--active" for=__toc> <span class=md-ellipsis> Editing files via scripts with ed </span> <span class="md-nav__icon md-icon"></span> </label> <a href=./ class="md-nav__link md-nav__link--active"> <span class=md-ellipsis> Editing files via scripts with ed </span> </a> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#why-ed class=md-nav__link> <span class=md-ellipsis> Why ed? </span> </a> </li> <li class=md-nav__item> <a href=#commanding-ed class=md-nav__link> <span class=md-ellipsis> Commanding ed </span> </a> </li> <li class=md-nav__item> <a href=#the-basic-interface class=md-nav__link> <span class=md-ellipsis> The basic interface </span> </a> </li> <li class=md-nav__item> <a href=#debugging-your-ed-scripts class=md-nav__link> <span class=md-ellipsis> Debugging your ed scripts </span> </a> </li> <li class=md-nav__item> <a href=#editing-your-files class=md-nav__link> <span class=md-ellipsis> Editing your files </span> </a> <nav class=md-nav aria-label="Editing your files"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#simple-word-substitutions class=md-nav__link> <span class=md-ellipsis> Simple word substitutions </span> </a> <nav class=md-nav aria-label="Simple word substitutions"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#substitutions-through-the-whole-file class=md-nav__link> <span class=md-ellipsis> Substitutions through the whole file </span> </a> </li> <li class=md-nav__item> <a href=#substitutions-in-specific-lines class=md-nav__link> <span class=md-ellipsis> Substitutions in specific lines </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#block-operations class=md-nav__link> <span class=md-ellipsis> Block operations </span> </a> <nav class=md-nav aria-label="Block operations"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#delete-a-block-of-text class=md-nav__link> <span class=md-ellipsis> Delete a block of text </span> </a> </li> <li class=md-nav__item> <a href=#move-a-block-of-text class=md-nav__link> <span class=md-ellipsis> Move a block of text </span> </a> </li> <li class=md-nav__item> <a href=#copy-a-block-of-text class=md-nav__link> <span class=md-ellipsis> Copy a block of text </span> </a> </li> <li class=md-nav__item> <a href=#join-all-lines class=md-nav__link> <span class=md-ellipsis> Join all lines </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#file-operations class=md-nav__link> <span class=md-ellipsis> File operations </span> </a> <nav class=md-nav aria-label="File operations"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#insert-another-file class=md-nav__link> <span class=md-ellipsis> Insert another file </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#pitfalls class=md-nav__link> <span class=md-ellipsis> Pitfalls </span> </a> <nav class=md-nav aria-label=Pitfalls> <ul class=md-nav__list> <li class=md-nav__item> <a href=#ed-is-not-sed class=md-nav__link> <span class=md-ellipsis> ed is not sed </span> </a> </li> <li class=md-nav__item> <a href=#here-documents class=md-nav__link> <span class=md-ellipsis> here documents </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#simulate-other-commands class=md-nav__link> <span class=md-ellipsis> Simulate other commands </span> </a> <nav class=md-nav aria-label="Simulate other commands"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#a-simple-grep class=md-nav__link> <span class=md-ellipsis> A simple grep </span> </a> </li> <li class=md-nav__item> <a href=#wc-l class=md-nav__link> <span class=md-ellipsis> wc -l </span> </a> </li> <li class=md-nav__item> <a href=#cat class=md-nav__link> <span class=md-ellipsis> cat </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#links class=md-nav__link> <span class=md-ellipsis> Links </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../getopts_tutorial/ class=md-nav__link> <span class=md-ellipsis> Small getopts tutorial </span> </a> </li> <li class=md-nav__item> <a href=../mutex/ class=md-nav__link> <span class=md-ellipsis> Lock your script (against parallel execution) </span> </a> </li> <li class=md-nav__item> <a href=../pax/ class=md-nav__link> <span class=md-ellipsis> pax - the POSIX archiver </span> </a> </li> <li class=md-nav__item> <a href=../redirection_tutorial/ class=md-nav__link> <span class=md-ellipsis> Illustrated Redirection Tutorial </span> </a> </li> <li class=md-nav__item> <a href=../testing-your-scripts/ class=md-nav__link> <span class=md-ellipsis> Testing your scripts </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_5> <label class=md-nav__link for=__nav_5 id=__nav_5_label tabindex=0> <span class=md-ellipsis> Internals </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_5_label aria-expanded=false> <label class=md-nav__title for=__nav_5> <span class="md-nav__icon md-icon"></span> Internals </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../internals/shell_options/ class=md-nav__link> <span class=md-ellipsis> List of shell options </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_6> <label class=md-nav__link for=__nav_6 id=__nav_6_label tabindex=0> <span class=md-ellipsis> Misc </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_6_label aria-expanded=false> <label class=md-nav__title for=__nav_6> <span class="md-nav__icon md-icon"></span> Misc </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../misc/bashphorisms/ class=md-nav__link> <span class=md-ellipsis> The Bashphorisms </span> </a> </li> <li class=md-nav__item> <a href=../../misc/readthesourceluke/ class=md-nav__link> <span class=md-ellipsis> Readthesourceluke </span> </a> </li> <li class=md-nav__item> <a href=../../misc/shell_humor/ class=md-nav__link> <span class=md-ellipsis> Shell Humor </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_7> <label class=md-nav__link for=__nav_7 id=__nav_7_label tabindex=0> <span class=md-ellipsis> Scripting </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_7_label aria-expanded=false> <label class=md-nav__title for=__nav_7> <span class="md-nav__icon md-icon"></span> Scripting </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../scripting/bashbehaviour/ class=md-nav__link> <span class=md-ellipsis> Bash's behaviour </span> </a> </li> <li class=md-nav__item> <a href=../../scripting/bashchanges/ class=md-nav__link> <span class=md-ellipsis> Bash changes </span> </a> </li> <li class=md-nav__item> <a href=../../scripting/basics/ class=md-nav__link> <span class=md-ellipsis> The basics of shell scripting </span> </a> </li> <li class=md-nav__item> <a href=../../scripting/debuggingtips/ class=md-nav__link> <span class=md-ellipsis> Debugging a script </span> </a> </li> <li class=md-nav__item> <a href=../../scripting/newbie_traps/ class=md-nav__link> <span class=md-ellipsis> Beginner Mistakes </span> </a> </li> <li class=md-nav__item> <a href=../../scripting/nonportable/ class=md-nav__link> <span class=md-ellipsis> Portability talk </span> </a> </li> <li class=md-nav__item> <a href=../../scripting/obsolete/ class=md-nav__link> <span class=md-ellipsis> Obsolete and deprecated syntax </span> </a> </li> <li class=md-nav__item> <a href=../../scripting/posparams/ class=md-nav__link> <span class=md-ellipsis> Handling positional parameters </span> </a> </li> <li class=md-nav__item> <a href=../../scripting/processtree/ class=md-nav__link> <span class=md-ellipsis> Bash and the process tree </span> </a> </li> <li class=md-nav__item> <a href=../../scripting/style/ class=md-nav__link> <span class=md-ellipsis> Scripting with style </span> </a> </li> <li class=md-nav__item> <a href=../../scripting/terminalcodes/ class=md-nav__link> <span class=md-ellipsis> Terminal codes (ANSI/VT100) introduction </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_8> <label class=md-nav__link for=__nav_8 id=__nav_8_label tabindex=0> <span class=md-ellipsis> Snipplets </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_8_label aria-expanded=false> <label class=md-nav__title for=__nav_8> <span class="md-nav__icon md-icon"></span> Snipplets </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../snipplets/ class=md-nav__link> <span class=md-ellipsis> Small code snipplets </span> </a> </li> <li class=md-nav__item> <a href=../../snipplets/add_color_to_your_scripts/ class=md-nav__link> <span class=md-ellipsis> Add Color to your scripts </span> </a> </li> <li class=md-nav__item> <a href=../../snipplets/awkcsv/ class=md-nav__link> <span class=md-ellipsis> Using awk to deal with CSV that uses quoted/unquoted delimiters </span> </a> </li> <li class=md-nav__item> <a href=../../snipplets/filesize/ class=md-nav__link> <span class=md-ellipsis> Show size of a file </span> </a> </li> <li class=md-nav__item> <a href=../../snipplets/kill_bg_job_without_message/ class=md-nav__link> <span class=md-ellipsis> Kill a background job without a message </span> </a> </li> <li class=md-nav__item> <a href=../../snipplets/largestfile/ class=md-nav__link> <span class=md-ellipsis> Get largest file </span> </a> </li> <li class=md-nav__item> <a href=../../snipplets/pause_command/ class=md-nav__link> <span class=md-ellipsis> Pausing a script (like MSDOS pause command) </span> </a> </li> <li class=md-nav__item> <a href=../../snipplets/prargs/ class=md-nav__link> <span class=md-ellipsis> Print argument list for testing </span> </a> </li> <li class=md-nav__item> <a href=../../snipplets/print_horizontal_line/ class=md-nav__link> <span class=md-ellipsis> Print a horizontal line </span> </a> </li> <li class=md-nav__item> <a href=../../snipplets/rndstr/ class=md-nav__link> <span class=md-ellipsis> Print a random string or select random elements </span> </a> </li> <li class=md-nav__item> <a href=../../snipplets/screen_saverestore/ class=md-nav__link> <span class=md-ellipsis> Save and restore terminal/screen content </span> </a> </li> <li class=md-nav__item> <a href=../../snipplets/ssh_fetchkeys/ class=md-nav__link> <span class=md-ellipsis> Fetching SSH hostkeys without interaction </span> </a> </li> <li class=md-nav__item> <a href=../../snipplets/ssh_local_var/ class=md-nav__link> <span class=md-ellipsis> Run some bash commands with SSH remotely using local variables </span> </a> </li> <li class=md-nav__item> <a href=../../snipplets/wrapperargs/ class=md-nav__link> <span class=md-ellipsis> Generate code with own arguments properly quoted </span> </a> </li> <li class=md-nav__item> <a href=../../snipplets/xclip/ class=md-nav__link> <span class=md-ellipsis> X-Clipboard on Commandline </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_9> <label class=md-nav__link for=__nav_9 id=__nav_9_label tabindex=0> <span class=md-ellipsis> Syntax </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_9_label aria-expanded=false> <label class=md-nav__title for=__nav_9> <span class="md-nav__icon md-icon"></span> Syntax </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../syntax/arith_expr/ class=md-nav__link> <span class=md-ellipsis> Arithmetic expressions </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/arrays/ class=md-nav__link> <span class=md-ellipsis> Arrays </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/basicgrammar/ class=md-nav__link> <span class=md-ellipsis> Basic grammar rules of Bash </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/pattern/ class=md-nav__link> <span class=md-ellipsis> Patterns and pattern matching </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/pe/ class=md-nav__link> <span class=md-ellipsis> Parameter expansion </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/quoting/ class=md-nav__link> <span class=md-ellipsis> Quotes and escaping </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/redirection/ class=md-nav__link> <span class=md-ellipsis> Redirection </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/shellvars/ class=md-nav__link> <span class=md-ellipsis> Special parameters and shell variables </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/words/ class=md-nav__link> <span class=md-ellipsis> Words... </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_9_10> <label class=md-nav__link for=__nav_9_10 id=__nav_9_10_label tabindex=0> <span class=md-ellipsis> Ccmd </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_9_10_label aria-expanded=false> <label class=md-nav__title for=__nav_9_10> <span class="md-nav__icon md-icon"></span> Ccmd </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../syntax/ccmd/arithmetic_eval/ class=md-nav__link> <span class=md-ellipsis> Arithmetic evaluation (command) </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/ccmd/c_for/ class=md-nav__link> <span class=md-ellipsis> The C-style for-loop </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/ccmd/case/ class=md-nav__link> <span class=md-ellipsis> The case statement </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/ccmd/classic_for/ class=md-nav__link> <span class=md-ellipsis> The classic for-loop </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/ccmd/conditional_expression/ class=md-nav__link> <span class=md-ellipsis> The conditional expression </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/ccmd/grouping_plain/ class=md-nav__link> <span class=md-ellipsis> Grouping commands </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/ccmd/grouping_subshell/ class=md-nav__link> <span class=md-ellipsis> Grouping commands in a subshell </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/ccmd/if_clause/ class=md-nav__link> <span class=md-ellipsis> The if-clause </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/ccmd/intro/ class=md-nav__link> <span class=md-ellipsis> Bash compound commands </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/ccmd/until_loop/ class=md-nav__link> <span class=md-ellipsis> The until loop </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/ccmd/user_select/ class=md-nav__link> <span class=md-ellipsis> User selections </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/ccmd/while_loop/ class=md-nav__link> <span class=md-ellipsis> The while-loop </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_9_11> <label class=md-nav__link for=__nav_9_11 id=__nav_9_11_label tabindex=0> <span class=md-ellipsis> Expansion </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_9_11_label aria-expanded=false> <label class=md-nav__title for=__nav_9_11> <span class="md-nav__icon md-icon"></span> Expansion </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../syntax/expansion/arith/ class=md-nav__link> <span class=md-ellipsis> Arithmetic expansion </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/expansion/brace/ class=md-nav__link> <span class=md-ellipsis> Brace expansion </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/expansion/cmdsubst/ class=md-nav__link> <span class=md-ellipsis> Command substitution </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/expansion/globs/ class=md-nav__link> <span class=md-ellipsis> Pathname expansion (globbing) </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/expansion/intro/ class=md-nav__link> <span class=md-ellipsis> Expansions and substitutions </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/expansion/proc_subst/ class=md-nav__link> <span class=md-ellipsis> Process substitution </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/expansion/tilde/ class=md-nav__link> <span class=md-ellipsis> Tilde expansion </span> </a> </li> <li class=md-nav__item> <a href=../../syntax/expansion/wordsplit/ class=md-nav__link> <span class=md-ellipsis> Word splitting </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_9_12> <label class=md-nav__link for=__nav_9_12 id=__nav_9_12_label tabindex=0> <span class=md-ellipsis> Grammar </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_9_12_label aria-expanded=false> <label class=md-nav__title for=__nav_9_12> <span class="md-nav__icon md-icon"></span> Grammar </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../syntax/grammar/parser_exec/ class=md-nav__link> <span class=md-ellipsis> Parser exec </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_9_13> <label class=md-nav__link for=__nav_9_13 id=__nav_9_13_label tabindex=0> <span class=md-ellipsis> Keywords </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=2 aria-labelledby=__nav_9_13_label aria-expanded=false> <label class=md-nav__title for=__nav_9_13> <span class="md-nav__icon md-icon"></span> Keywords </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../../syntax/keywords/coproc/ class=md-nav__link> <span class=md-ellipsis> The coproc keyword </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../../tags/ class=md-nav__link> <span class=md-ellipsis> Tags </span> </a> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component=sidebar data-md-type=toc> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#why-ed class=md-nav__link> <span class=md-ellipsis> Why ed? </span> </a> </li> <li class=md-nav__item> <a href=#commanding-ed class=md-nav__link> <span class=md-ellipsis> Commanding ed </span> </a> </li> <li class=md-nav__item> <a href=#the-basic-interface class=md-nav__link> <span class=md-ellipsis> The basic interface </span> </a> </li> <li class=md-nav__item> <a href=#debugging-your-ed-scripts class=md-nav__link> <span class=md-ellipsis> Debugging your ed scripts </span> </a> </li> <li class=md-nav__item> <a href=#editing-your-files class=md-nav__link> <span class=md-ellipsis> Editing your files </span> </a> <nav class=md-nav aria-label="Editing your files"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#simple-word-substitutions class=md-nav__link> <span class=md-ellipsis> Simple word substitutions </span> </a> <nav class=md-nav aria-label="Simple word substitutions"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#substitutions-through-the-whole-file class=md-nav__link> <span class=md-ellipsis> Substitutions through the whole file </span> </a> </li> <li class=md-nav__item> <a href=#substitutions-in-specific-lines class=md-nav__link> <span class=md-ellipsis> Substitutions in specific lines </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#block-operations class=md-nav__link> <span class=md-ellipsis> Block operations </span> </a> <nav class=md-nav aria-label="Block operations"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#delete-a-block-of-text class=md-nav__link> <span class=md-ellipsis> Delete a block of text </span> </a> </li> <li class=md-nav__item> <a href=#move-a-block-of-text class=md-nav__link> <span class=md-ellipsis> Move a block of text </span> </a> </li> <li class=md-nav__item> <a href=#copy-a-block-of-text class=md-nav__link> <span class=md-ellipsis> Copy a block of text </span> </a> </li> <li class=md-nav__item> <a href=#join-all-lines class=md-nav__link> <span class=md-ellipsis> Join all lines </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#file-operations class=md-nav__link> <span class=md-ellipsis> File operations </span> </a> <nav class=md-nav aria-label="File operations"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#insert-another-file class=md-nav__link> <span class=md-ellipsis> Insert another file </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#pitfalls class=md-nav__link> <span class=md-ellipsis> Pitfalls </span> </a> <nav class=md-nav aria-label=Pitfalls> <ul class=md-nav__list> <li class=md-nav__item> <a href=#ed-is-not-sed class=md-nav__link> <span class=md-ellipsis> ed is not sed </span> </a> </li> <li class=md-nav__item> <a href=#here-documents class=md-nav__link> <span class=md-ellipsis> here documents </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#simulate-other-commands class=md-nav__link> <span class=md-ellipsis> Simulate other commands </span> </a> <nav class=md-nav aria-label="Simulate other commands"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#a-simple-grep class=md-nav__link> <span class=md-ellipsis> A simple grep </span> </a> </li> <li class=md-nav__item> <a href=#wc-l class=md-nav__link> <span class=md-ellipsis> wc -l </span> </a> </li> <li class=md-nav__item> <a href=#cat class=md-nav__link> <span class=md-ellipsis> cat </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=#links class=md-nav__link> <span class=md-ellipsis> Links </span> </a> </li> </ul> </nav> </div> </div> </div> <div class=md-content data-md-component=content> <article class="md-content__inner md-typeset"> <nav class=md-tags> <a href=../../tags/#bash class=md-tag>bash</a> <a href=../../tags/#shell class=md-tag>shell</a> <a href=../../tags/#scripting class=md-tag>scripting</a> <a href=../../tags/#arguments class=md-tag>arguments</a> <a href=../../tags/#file class=md-tag>file</a> <a href=../../tags/#editor class=md-tag>editor</a> <a href=../../tags/#edit class=md-tag>edit</a> <a href=../../tags/#ed class=md-tag>ed</a> <a href=../../tags/#sed class=md-tag>sed</a> </nav> <a href=https://github.com/flokoe/bash-hackers-wiki/edit/main/docs/howto/edit-ed.md title="Edit this page" class="md-content__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg> </a> <a href=https://github.com/flokoe/bash-hackers-wiki/raw/main/docs/howto/raw-ed.md title="View source of this page" class="md-content__button md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg> </a> <h1 id=editing-files-via-scripts-with-ed>Editing files via scripts with ed<a class=headerlink href=#editing-files-via-scripts-with-ed title="Permanent link">&para;</a></h1> <h2 id=why-ed>Why ed?<a class=headerlink href=#why-ed title="Permanent link">&para;</a></h2> <p>Like <code>sed</code>, <code>ed</code> is a line editor. However, if you try to change file contents with <code>sed</code>, and the file is open elsewhere and read by some process, you will find out that GNU <code>sed</code> and its <code>-i</code> option will not allow you to edit the file. There are circumstances where you may need that, e.g. editing active and open files, the lack of GNU, or other <code>sed</code>, with "in-place" option available.</p> <p>Why <code>ed</code>?</p> <ul> <li>maybe your <code>sed</code> doesn't support in-place edit</li> <li>maybe you need to be as portable as possible</li> <li>maybe you need to really edit in-file (and not create a new file like GNU <code>sed</code>)</li> <li>last but not least: standard <code>ed</code> has very good editing and addressing possibilities, compared to standard <code>sed</code></li> </ul> <p>Don't get me wrong, this is <strong>not</strong> meant as anti-<code>sed</code> article! It's just meant to show you another way to do the job.</p> <h2 id=commanding-ed>Commanding ed<a class=headerlink href=#commanding-ed title="Permanent link">&para;</a></h2> <p>Since <code>ed</code> is an interactive text editor, it reads and executes commands that come from <code>stdin</code>. There are several ways to feed our commands to ed:</p> <p><strong><u>Pipelines</u></strong></p> <div class=highlight><pre><span></span><code>echo &#39;&lt;ED-COMMANDS&gt;&#39; | ed &lt;FILE&gt;
</code></pre></div> <p>To inject the needed newlines, etc. it may be easier to use the builtin command, <code>printf</code> ("help printf"). Shown here as an example Bash function to prefix text to file content:</p> <div class=highlight><pre><span></span><code># insertHead &quot;$text&quot; &quot;$file&quot;
insertHead() {
printf &#39;%s\n&#39; H 1i &quot;$1&quot; . w | ed -s &quot;$2&quot;
}
</code></pre></div> <p><strong><u>Here-strings</u></strong></p> <div class=highlight><pre><span></span><code>ed &lt;FILE&gt; &lt;&lt;&lt; &#39;&lt;ED-COMMANDS&gt;&#39;
</code></pre></div> <p><strong><u>Here-documents</u></strong></p> <div class=highlight><pre><span></span><code>ed &lt;FILE&gt; &lt;&lt;EOF
&lt;ED-COMMANDS&gt;
EOF
</code></pre></div> <p>Which one you prefer is your choice. I will use the here-strings, since it looks best here IMHO.</p> <p>There are other ways to provide input to <code>ed</code>. For example, process substitution. But these should be enough for daily needs.</p> <p>Since <code>ed</code> wants commands separated by newlines, I'll use a special Bash quoting method, the C-like strings <code>$'TEXT'</code>, as it can interpret a set of various escape sequences and special characters. I'll use the <code>-s</code> option to make it less verbose.</p> <h2 id=the-basic-interface>The basic interface<a class=headerlink href=#the-basic-interface title="Permanent link">&para;</a></h2> <p>Check the <code>ed</code> manpage for details</p> <p>Similar to <code>vi</code> or <code>vim</code>, <code>ed</code> has a "command mode" and an "interactive mode". For non-interactive use, the command mode is the usual choice.</p> <p>Commands to <code>ed</code> have a simple and regular structure: zero, one, or two addresses followed by a single-character command, possibly followed by parameters to that command. These addresses specify one or more lines in the text buffer. Every command that requires addresses has default addresses, so the addresses can often be omitted.</p> <p>The line addressing is relative to the <em>current line</em>. If the edit buffer is not empty, the initial value for the <em>current line</em> shall be the last line in the edit buffer, otherwise zero. Generally, the <em>current line</em> is the last line affected by a command. All addresses can only address single lines, not blocks of lines!</p> <p>Line addresses or commands using <em>regular expressions</em> interpret POSIX Basic Regular Expressions (BRE). A null BRE is used to reference the most recently used BRE. Since <code>ed</code> addressing is only for single lines, no RE can ever match a newline.</p> <h2 id=debugging-your-ed-scripts>Debugging your ed scripts<a class=headerlink href=#debugging-your-ed-scripts title="Permanent link">&para;</a></h2> <p>By default, <code>ed</code> is not very talkative and will simply print a "?" when an error occurs. Interactively you can use the <code>h</code> command to get a short message explaining the last error. You can also turn on a mode that makes <code>ed</code> automatically print this message with the <code>H</code> command. It is a good idea to always add this command at the beginning of your ed scripts:</p> <div class=highlight><pre><span></span><code>bash &gt; ed -s file &lt;&lt;&lt; $&#39;H\n,df&#39;
?
script, line 2: Invalid command suffix
</code></pre></div> <p>While working on your script, you might make errors and destroy your file, you might be tempted to try your script doing something like:</p> <div class=highlight><pre><span></span><code># Works, but there is better
# copy my original file
cp file file.test
# try my script on the file
ed -s file.test &lt;&lt;&lt; $&#39;H\n&lt;ed commands&gt;\nw&#39;
# see the results
cat file.test
</code></pre></div> <p>There is a much better way though, you can use the ed command <code>p</code> to print the file, now your testing would look like:</p> <div class=highlight><pre><span></span><code>ed -s file &lt;&lt;&lt; $&#39;H\n&lt;ed commands&gt;\n,p&#39;
</code></pre></div> <p>the <code>,</code> (comma) in front of the <code>p</code> command is a shortcut for <code>1,$</code> which defines an address range for the first to the last line, <code>,p</code> thus means print the whole file, after it has been modified. When your script runs sucessfully, you only have to replace the <code>,p</code> by a <code>w</code>.</p> <p>Of course, even if the file is not modified by the <code>p</code> command, <strong>it's always a good idea to have a backup copy!</strong></p> <h2 id=editing-your-files>Editing your files<a class=headerlink href=#editing-your-files title="Permanent link">&para;</a></h2> <p>Most of these things can be done with <code>sed</code>. But there are also things that can't be done in <code>sed</code> or can only be done with very complex code.</p> <h3 id=simple-word-substitutions>Simple word substitutions<a class=headerlink href=#simple-word-substitutions title="Permanent link">&para;</a></h3> <p>Like <code>sed</code>, <code>ed</code> also knows the common <code>s/FROM/TO/</code> command, and it can also take line-addresses. <strong>If no substitution is made on the addressed lines, it's considered an error.</strong></p> <h4 id=substitutions-through-the-whole-file>Substitutions through the whole file<a class=headerlink href=#substitutions-through-the-whole-file title="Permanent link">&para;</a></h4> <div class=highlight><pre><span></span><code>ed -s test.txt &lt;&lt;&lt; $&#39;,s/Windows(R)-compatible/POSIX-conform/g\nw&#39;
</code></pre></div> <p><u>Note:</u> The comma as single address operator is an alias for <code>1,$</code> ("all lines").</p> <h4 id=substitutions-in-specific-lines>Substitutions in specific lines<a class=headerlink href=#substitutions-in-specific-lines title="Permanent link">&para;</a></h4> <p>On a line containing <code>fruits</code>, do the substitution:</p> <div class=highlight><pre><span></span><code>ed -s test.txt &lt;&lt;&lt; $&#39;/fruits/s/apple/banana/g\nw&#39;
</code></pre></div> <p>On the 5<sup>th</sup> line after the line containing <code>fruits</code>, do the substitution:</p> <div class=highlight><pre><span></span><code>ed -s test.txt &lt;&lt;&lt; $&#39;/fruits/+5s/apple/banana/g\nw&#39;
</code></pre></div> <h3 id=block-operations>Block operations<a class=headerlink href=#block-operations title="Permanent link">&para;</a></h3> <h4 id=delete-a-block-of-text>Delete a block of text<a class=headerlink href=#delete-a-block-of-text title="Permanent link">&para;</a></h4> <p>The simple one is a well-known (by position) block of text:</p> <div class=highlight><pre><span></span><code># delete lines number 2 to 4 (2, 3, 4)
ed -s test.txt &lt;&lt;&lt; $&#39;2,5d\nw&#39;
</code></pre></div> <p>This deletes all lines matching a specific regular expression:</p> <div class=highlight><pre><span></span><code># delete all lines matching foobar
ed -s test.txt &lt;&lt;&lt; $&#39;g/foobar/d\nw&#39;
</code></pre></div> <p>g/regexp/ applies the command following it to all the lines matching the regexp</p> <h4 id=move-a-block-of-text>Move a block of text<a class=headerlink href=#move-a-block-of-text title="Permanent link">&para;</a></h4> <p>...using the <code>m</code> command: <code>&lt;ADDRESS&gt; m &lt;TARGET-ADDRESS&gt;</code></p> <p>This is definitely something that can't be done easily with sed.</p> <div class=highlight><pre><span></span><code># moving lines 5-9 to the end of the file
ed -s test.txt &lt;&lt;&lt; $&#39;5,9m$\nw&#39;
# moving lines 5-9 to line 3
ed -s test.txt &lt;&lt;&lt; $&#39;5,9m3\nw&#39;
</code></pre></div> <h4 id=copy-a-block-of-text>Copy a block of text<a class=headerlink href=#copy-a-block-of-text title="Permanent link">&para;</a></h4> <p>...using the <code>t</code> command: <code>&lt;ADDRESS&gt; t &lt;TARGET-ADDRESS&gt;</code></p> <p>You use the <code>t</code> command just like you use the <code>m</code> (move) command.</p> <div class=highlight><pre><span></span><code># make a copy of lines 5-9 and place it at the end of the file
ed -s test.txt &lt;&lt;&lt; $&#39;5,9t$\nw&#39;
# make a copy of lines 5-9 and place it at line 3
ed -s test.txt &lt;&lt;&lt; $&#39;5,9t3\nw&#39;
</code></pre></div> <h4 id=join-all-lines>Join all lines<a class=headerlink href=#join-all-lines title="Permanent link">&para;</a></h4> <p>...but leave the final newline intact. This is done by an extra command: <code>j</code> (join).</p> <div class=highlight><pre><span></span><code>ed -s file &lt;&lt;&lt; $&#39;1,$j\nw&#39;
</code></pre></div> <p>Compared with two other methods (using <code>tr</code> or <code>sed</code>), you don't have to delete all newlines and manually add one at the end.</p> <h3 id=file-operations>File operations<a class=headerlink href=#file-operations title="Permanent link">&para;</a></h3> <h4 id=insert-another-file>Insert another file<a class=headerlink href=#insert-another-file title="Permanent link">&para;</a></h4> <p>How do you insert another file? As with <code>sed</code>, you use the <code>r</code> (read) command. That inserts another file at the line before the last line (and prints the result to stdout - <code>,p</code>):</p> <div class=highlight><pre><span></span><code>ed -s FILE1 &lt;&lt;&lt; $&#39;$-1 r FILE2\n,p&#39;
</code></pre></div> <p>To compare, here's a possible <code>sed</code> solution which must use Bash arithmetic and the external program <code>wc</code>:</p> <div class=highlight><pre><span></span><code>sed &quot;$(($(wc -l &lt; FILE1)-1))r FILE2&quot; FILE1
# UPDATE here&#39;s one which uses GNU sed&#39;s &quot;e&quot; parameter for the s-command
# it executes the commands found in pattern space. I&#39;ll take that as a
# security risk, but well, sometimes GNU &gt; security, you know...
sed &#39;${h;s/.*/cat FILE2/e;G}&#39; FILE1
</code></pre></div> <p>Another approach, in two invocations of sed, that avoids the use of external commands completely:</p> <div class=highlight><pre><span></span><code>sed $&#39;${s/$/\\n-||-/;r FILE2\n}&#39; FILE1 | sed &#39;0,/-||-/{//!h;N;//D};$G&#39;
</code></pre></div> <h2 id=pitfalls>Pitfalls<a class=headerlink href=#pitfalls title="Permanent link">&para;</a></h2> <h3 id=ed-is-not-sed>ed is not sed<a class=headerlink href=#ed-is-not-sed title="Permanent link">&para;</a></h3> <p>ed and sed might look similar, but the same command(s) might act differently:</p> <p><strong>__ /foo/d __</strong></p> <p>In sed /foo/d will delete all lines matching foo, in ed the commands are not repeated on each line so this command will search the next line matching foo and delete it. If you want to delete all lines matching foo, or do a subsitution on all lines matching foo you have to tell ed about it with the g (global) command:</p> <div class=highlight><pre><span></span><code>echo $&#39;1\n1\n3&#39; &gt; file
#replace all lines matching 1 by &quot;replacement&quot;
ed -s file &lt;&lt;&lt; $&#39;g/1/s/1/replacement/\n,p&#39;
#replace the first line matching 1 by &quot;replacement&quot;
#(because it starts searching from the last line)
ed -s file &lt;&lt;&lt; $&#39;s/1/replacement/\n,p&#39;
</code></pre></div> <p><strong>__ an error stops the script __</strong></p> <p>You might think that it's not a problem and that the same thing happens with sed and you're right, with the exception that if ed does not find a pattern it's an error, while sed just continues with the next line. For instance, let's say that you want to change foo to bar on the first line of the file and add something after the next line, ed will stop if it cannot find foo on the first line, sed will continue.</p> <div class=highlight><pre><span></span><code>#Gnu sed version
sed -e &#39;1s/foo/bar/&#39; -e &#39;$a\something&#39; file
#First ed version, does nothing if foo is not found on the first line:
ed -s file &lt;&lt;&lt; $&#39;H\n1s/foo/bar/\na\nsomething\n.\nw&#39;
</code></pre></div> <p>If you want the same behaviour you can use g/foo/ to trick ed. g/foo/ will apply the command on all lines matching foo, thus the substitution will succeed and ed will not produce an error when foo is not found:</p> <div class=highlight><pre><span></span><code>#Second version will add the line with &quot;something&quot; even if foo is not found
ed -s file &lt;&lt;&lt; $&#39;H\n1g/foo/s/foo/bar/\na\nsomething\n.\nw&#39;
</code></pre></div> <p>In fact, even a substitution that fails after a g/ / command does not seem to cause an error, i.e. you can use a trick like g/./s/foo/bar/ to attempt the substitution on all non blank lines</p> <h3 id=here-documents>here documents<a class=headerlink href=#here-documents title="Permanent link">&para;</a></h3> <p><strong>__ shell parameters are expanded __</strong></p> <p>If you don't quote the delimiter, <code>$</code> has a special meaning. This sounds obvious but it's easy to forget this fact when you use addresses like <code>$-1</code> or commands like <code>$a</code>. Either quote the <code>$</code> or the delimiter:</p> <div class=highlight><pre><span></span><code>#fails
ed -s file &lt;&lt; EOF
$a
last line
.
w
EOF
#ok
ed -s file &lt;&lt; EOF
$a
last line
.
w
EOF
#ok again
ed -s file &lt;&lt; &#39;EOF&#39;
$a
last line
.
w
EOF
</code></pre></div> <p><strong>__ "." is not a command __</strong></p> <p>The . used to terminate the command "a" must be the only thing on the line. take care if you indent the commands:</p> <div class=highlight><pre><span></span><code>#ed doesn&#39;t care about the spaces before the commands, but the . must be the only thing on the line:
ed -s file &lt;&lt; EOF
a
my content
.
w
EOF
</code></pre></div> <h2 id=simulate-other-commands>Simulate other commands<a class=headerlink href=#simulate-other-commands title="Permanent link">&para;</a></h2> <p>Keep in mind that in all the examples below, the entire file will be read into memory.</p> <h3 id=a-simple-grep>A simple grep<a class=headerlink href=#a-simple-grep title="Permanent link">&para;</a></h3> <div class=highlight><pre><span></span><code>ed -s file &lt;&lt;&lt; &#39;g/foo/p&#39;
# equivalent
ed -s file &lt;&lt;&lt; &#39;g/foo/&#39;
</code></pre></div> <p>The name <code>grep</code> is derived from the notaion <code>g/RE/p</code> (global =&gt; regular expression =&gt; print). ref <a href=http://www.catb.org/~esr/jargon/html/G/grep.html>http://www.catb.org/~esr/jargon/html/G/grep.html</a></p> <h3 id=wc-l>wc -l<a class=headerlink href=#wc-l title="Permanent link">&para;</a></h3> <p>Since the default for the <code>ed</code> "print line number" command is the last line, a simple <code>=</code> (equal sign) will print this line number and thus the number of lines of the file:</p> <div class=highlight><pre><span></span><code>ed -s file &lt;&lt;&lt; &#39;=&#39;
</code></pre></div> <h3 id=cat>cat<a class=headerlink href=#cat title="Permanent link">&para;</a></h3> <p>Yea, it's a joke...</p> <div class=highlight><pre><span></span><code>ed -s file &lt;&lt;&lt; $&#39;,p&#39;
</code></pre></div> <p>...but a similar thing to <code>cat</code> showing line-endings and escapes can be done with the <code>list</code> command (l):</p> <div class=highlight><pre><span></span><code>ed -s file &lt;&lt;&lt; $&#39;,l&#39;
</code></pre></div> <div class="admonition warning"> <p class=admonition-title>FIXME</p> <p>to be continued</p> </div> <h2 id=links>Links<a class=headerlink href=#links title="Permanent link">&para;</a></h2> <p>Reference:</p> <ul> <li><a href=http://www.gnu.org/software/ed/manual/ed_manual.html>Gnu ed</a> - if we had to guess, you're probably using this one.</li> <li>POSIX <a href=http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ed.html#tag_20_38>ed</a>, <a href=http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html#tag_20_40>ex</a>, and <a href=http://pubs.opengroup.org/onlinepubs/9699919799/utilities/vi.html#tag_20_152>vi</a></li> <li><a href=http://sdf.lonestar.org/index.cgi?tutorials/ed>http://sdf.lonestar.org/index.cgi?tutorials/ed</a> - ed cheatsheet on sdf.org</li> </ul> <p>Misc info / tutorials:</p> <ul> <li><a href=http://mywiki.wooledge.org/BashFAQ/021>How can I replace a string with another string in a variable, a stream, a file, or in all the files in a directory?</a> - BashFAQ</li> <li><a href=http://wolfram.schneider.org/bsd/7thEdManVol2/edtut/edtut.pdf>http://wolfram.schneider.org/bsd/7thEdManVol2/edtut/edtut.pdf</a> - Old but still relevant ed tutorial.</li> </ul> <aside class=md-source-file> <span class=md-source-file__fact> <span class=md-icon title="Last update"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M21 13.1c-.1 0-.3.1-.4.2l-1 1 2.1 2.1 1-1c.2-.2.2-.6 0-.8l-1.3-1.3c-.1-.1-.2-.2-.4-.2m-1.9 1.8-6.1 6V23h2.1l6.1-6.1zM12.5 7v5.2l4 2.4-1 1L11 13V7zM11 21.9c-5.1-.5-9-4.8-9-9.9C2 6.5 6.5 2 12 2c5.3 0 9.6 4.1 10 9.3-.3-.1-.6-.2-1-.2s-.7.1-1 .2C19.6 7.2 16.2 4 12 4c-4.4 0-8 3.6-8 8 0 4.1 3.1 7.5 7.1 7.9l-.1.2z"/></svg> </span> <span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">November 13, 2024</span> </span> <span class=md-source-file__fact> <span class=md-icon title=Created> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M14.47 15.08 11 13V7h1.5v5.25l3.08 1.83c-.41.28-.79.62-1.11 1m-1.39 4.84c-.36.05-.71.08-1.08.08-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8c0 .37-.03.72-.08 1.08.69.1 1.33.32 1.92.64.1-.56.16-1.13.16-1.72 0-5.5-4.5-10-10-10S2 6.5 2 12s4.47 10 10 10c.59 0 1.16-.06 1.72-.16-.32-.59-.54-1.23-.64-1.92M18 15v3h-3v2h3v3h2v-3h3v-2h-3v-3z"/></svg> </span> <span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">November 13, 2024</span> </span> </aside> <h2 id=__comments>Comments</h2> <script src=https://giscus.app/client.js data-repo=flokoe/bash-hackers-wiki data-repo-id=R_kgDOJ3Nr6Q data-category="Giscus Page Comments" data-category-id=DIC_kwDOJ3Nr6c4CXq9t data-mapping=pathname data-strict=1 data-reactions-enabled=1 data-emit-metadata=0 data-input-position=top data-theme=preferred_color_scheme data-lang=en data-loading=lazy crossorigin=anonymous async>
</script> <script>
var giscus = document.querySelector("script[src*=giscus]")
/* Set palette on initial load */
var palette = __md_get("__palette")
if (palette && typeof palette.color === "object") {
var theme = palette.color.scheme === "slate" ? "dark" : "light"
giscus.setAttribute("data-theme", theme)
}
/* Register event handlers after documented loaded */
document.addEventListener("DOMContentLoaded", function() {
var ref = document.querySelector("[data-md-component=palette]")
ref.addEventListener("change", function() {
var palette = __md_get("__palette")
if (palette && typeof palette.color === "object") {
var theme = palette.color.scheme === "slate" ? "dark" : "light"
/* Instruct Giscus to change theme */
var frame = document.querySelector(".giscus-frame")
frame.contentWindow.postMessage(
{ giscus: { setConfig: { theme } } },
"https://giscus.app"
)
}
})
})
</script> </article> </div> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type=button class="md-top md-icon" data-md-component=top hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> Back to top </button> </main> <footer class=md-footer> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-copyright> Made with <a href=https://squidfunk.github.io/mkdocs-material/ target=_blank rel=noopener> Material for MkDocs </a> </div> </div> </div> </footer> </div> <div class=md-dialog data-md-component=dialog> <div class="md-dialog__inner md-typeset"></div> </div> <script id=__config type=application/json>{"base": "../..", "features": ["navigation.instant", "navigation.tracking", "navigation.tabs", "navigation.sections", "navigation.top", "content.action.view", "content.action.edit", "search.suggest", "search.highlight", "content.code.copy"], "search": "../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script> <script src=../../assets/javascripts/bundle.83f73b43.min.js></script> </body> </html>