mirror of
https://github.com/rawiriblundell/wiki.bash-hackers.org
synced 2024-11-02 00:53:07 +01:00
702 lines
37 KiB
Plaintext
702 lines
37 KiB
Plaintext
<!DOCTYPE html>
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" dir="ltr" class="no-js">
|
|
<head><script type="text/javascript" src="/_static/js/bundle-playback.js?v=TPXmWR5s" charset="utf-8"></script>
|
|
<script type="text/javascript" src="/_static/js/wombat.js?v=txqj7nKC" charset="utf-8"></script>
|
|
<script type="text/javascript">
|
|
__wm.init("http://web.archive.org/web");
|
|
__wm.wombat("https://wiki.bash-hackers.org/howto/edit-ed?do=edit","20221007155747","http://web.archive.org/","web","/_static/",
|
|
"1665158267");
|
|
</script>
|
|
<link rel="stylesheet" type="text/css" href="/_static/css/banner-styles.css?v=S1zqJCYt" />
|
|
<link rel="stylesheet" type="text/css" href="/_static/css/iconochive.css?v=qtvMKcIJ" />
|
|
<!-- End Wayback Rewrite JS Include -->
|
|
|
|
<meta charset="UTF-8"/>
|
|
<title>Editing files via scripts with ed [Bash Hackers Wiki]</title>
|
|
<script>(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement)</script>
|
|
<meta name="viewport" content="width=device-width,initial-scale=1"/>
|
|
<link rel="shortcut icon" href="/web/20221007155747im_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/images/favicon.ico"/>
|
|
<link rel="apple-touch-icon" href="/web/20221007155747im_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/images/apple-touch-icon.png"/>
|
|
<meta name="generator" content="DokuWiki"/>
|
|
<meta name="robots" content="noindex,nofollow"/>
|
|
<link type="text/css" rel="stylesheet" href="/web/20221007155747cs_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/bootstrap/default/bootstrap.min.css"/>
|
|
<link rel="search" type="application/opensearchdescription+xml" href="/web/20221007155747/https://wiki.bash-hackers.org/lib/exe/opensearch.php" title="Bash Hackers Wiki"/>
|
|
<link rel="start" href="/"/>
|
|
<link rel="contents" href="/howto/edit-ed?do=index" title="Sitemap"/>
|
|
<link rel="manifest" href="/web/20221007155747/https://wiki.bash-hackers.org/lib/exe/manifest.php"/>
|
|
<link rel="alternate" type="application/rss+xml" title="Recent Changes" href="/web/20221007155747/https://wiki.bash-hackers.org/feed.php"/>
|
|
<link rel="alternate" type="application/rss+xml" title="Current namespace" href="/web/20221007155747/https://wiki.bash-hackers.org/feed.php?mode=list&ns=howto"/>
|
|
<link rel="alternate" type="text/html" title="Plain HTML" href="/web/20221007155747/https://wiki.bash-hackers.org/_export/xhtml/howto/edit-ed"/>
|
|
<link rel="alternate" type="text/plain" title="Wiki Markup" href="/web/20221007155747/https://wiki.bash-hackers.org/_export/raw/howto/edit-ed"/>
|
|
<link rel="stylesheet" type="text/css" href="/web/20221007155747cs_/https://wiki.bash-hackers.org/lib/exe/css.php?t=bootstrap3&tseed=54923c3deda180f2db5bd755cd8fbf1a"/>
|
|
<!--[if gte IE 9]><!-->
|
|
<script type="text/javascript">/*<![CDATA[*/var NS='howto';var JSINFO = {"updatable":1,"userreplace":1,"default_macro_string":"","plugins":{"edittable":{"default columnwidth":""}},"move_renameokay":false,"isadmin":0,"isauth":0,"bootstrap3":{"mode":"source","toc":[],"config":{"collapsibleSections":0,"fixedTopNavbar":1,"showSemanticPopup":0,"sidebarOnNavbar":0,"tagsOnTop":1,"tocAffix":1,"tocCollapseOnScroll":1,"tocCollapsed":0,"tocLayout":"default","useAnchorJS":1,"useAlternativeToolbarIcons":1}},"id":"howto:edit-ed","namespace":"howto","ACT":"source","useHeadingNavigation":1,"useHeadingContent":1};
|
|
/*!]]>*/</script>
|
|
<script type="text/javascript" charset="utf-8" src="/web/20221007155747js_/https://wiki.bash-hackers.org/lib/exe/jquery.php?tseed=23f888679b4f1dc26eef34902aca964f"></script>
|
|
<script type="text/javascript" charset="utf-8" src="/web/20221007155747js_/https://wiki.bash-hackers.org/lib/exe/js.php?t=bootstrap3&tseed=54923c3deda180f2db5bd755cd8fbf1a"></script>
|
|
<script type="text/javascript">/*<![CDATA[*/if (typeof IconifyConfig == 'undefined') { var IconifyConfig = { 'defaultAPI' : '/lib/tpl/bootstrap3/iconify.php?prefix={prefix}&icons={icons}' } }
|
|
/*!]]>*/</script>
|
|
<script type="text/javascript" src="/web/20221007155747js_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/bootstrap/js/bootstrap.min.js"></script>
|
|
<script type="text/javascript" src="/web/20221007155747js_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/anchorjs/anchor.min.js"></script>
|
|
<script type="text/javascript" src="/web/20221007155747js_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/typeahead/bootstrap3-typeahead.min.js"></script>
|
|
<script type="text/javascript" src="/web/20221007155747js_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/iconify/iconify.min.js"></script>
|
|
<script type="text/javascript" src="/web/20221007155747js_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/assets/iconify/plugins/fa.js"></script>
|
|
<!--<![endif]-->
|
|
<style type="text/css">@media screen { body { margin-top: 65px; } #dw__toc.affix { top: 55px; position: fixed !important; } #dw__toc .nav .nav .nav { display: none; } }</style>
|
|
<!--[if lt IE 9]>
|
|
<script type="text/javascript" src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
|
<script type="text/javascript" src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
|
<![endif]-->
|
|
</head>
|
|
<body class="default dokuwiki mode_source tpl_bootstrap3 dw-page-on-panel dw-fluid-container" data-page-id="howto:edit-ed"><div class="dokuwiki">
|
|
<header id="dokuwiki__header" class="dw-container dokuwiki container-fluid mx-5">
|
|
<!-- navbar -->
|
|
<nav id="dw__navbar" class="navbar navbar-fixed-top navbar-default" role="navigation">
|
|
|
|
<div class="dw-container container-fluid mx-5">
|
|
|
|
<div class="navbar-header">
|
|
|
|
<button class="navbar-toggle" type="button" data-toggle="collapse" data-target=".navbar-collapse">
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
</button>
|
|
|
|
<a class="navbar-brand d-flex align-items-center" href="/web/20221007155747/https://wiki.bash-hackers.org/start" accesskey="h" title="Bash Hackers Wiki"><img id="dw__logo" class="pull-left h-100 mr-4" alt="Bash Hackers Wiki" src="/web/20221007155747im_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/images/logo.png"/><div class="pull-right"><div id="dw__title">Bash Hackers Wiki</div></div></a>
|
|
</div>
|
|
|
|
<div class="collapse navbar-collapse">
|
|
|
|
|
|
|
|
|
|
<div class="navbar-right" id="dw__navbar_items">
|
|
|
|
|
|
<!-- navbar-searchform -->
|
|
<form action="/web/20221007155747/https://wiki.bash-hackers.org/howto/edit-ed" accept-charset="utf-8" class="navbar-form navbar-left search" id="dw__search" method="get" role="search">
|
|
<div class="input-group">
|
|
<input id="qsearch" autocomplete="off" type="search" placeholder="Search" value="" accesskey="f" name="q" class="form-control" title="[F]"/>
|
|
<div class="input-group-btn">
|
|
<button class="btn btn-default" type="submit" title="Search">
|
|
<span class="iconify" data-icon="mdi:magnify"></span> </button>
|
|
</div>
|
|
|
|
</div>
|
|
<input type="hidden" name="do" value="search"/>
|
|
</form>
|
|
<!-- /navbar-searchform -->
|
|
<!-- tools-menu -->
|
|
<ul class="nav navbar-nav dw-action-icon" id="dw__tools">
|
|
|
|
|
|
<li class="dropdown">
|
|
|
|
<a href="" class="dropdown-toggle" data-target="#" data-toggle="dropdown" title="" role="button" aria-haspopup="true" aria-expanded="false">
|
|
<span class="iconify" data-icon="mdi:wrench"></span> <span class="hidden-lg hidden-md hidden-sm">Tools</span> <span class="caret"></span>
|
|
</a>
|
|
|
|
<ul class="dropdown-menu tools" role="menu">
|
|
|
|
<li class="dropdown-header">
|
|
<span class="iconify" data-icon="mdi:account"></span> User Tools </li>
|
|
|
|
<li class="action"><a href="/web/20221007155747/https://wiki.bash-hackers.org/howto/edit-ed?do=register" title="Register" rel="nofollow" class="menuitem register"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M15 14c-2.67 0-8 1.33-8 4v2h16v-2c0-2.67-5.33-4-8-4m-9-4V7H4v3H1v2h3v3h2v-3h3v-2m6 2a4 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 4z"/></svg><span>Register</span></a></li><li class="action"><a href="/web/20221007155747/https://wiki.bash-hackers.org/howto/edit-ed?do=login&sectok=" title="Log In" rel="nofollow" class="menuitem login"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M10 17.25V14H3v-4h7V6.75L15.25 12 10 17.25M8 2h9a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2v-4h2v4h9V4H8v4H6V4a2 2 0 0 1 2-2z"/></svg><span>Log In</span></a></li>
|
|
<li class="divider" role="separator"></li>
|
|
|
|
|
|
<li class="dropdown-header">
|
|
<span class="iconify" data-icon="mdi:toolbox"></span> Site Tools </li>
|
|
|
|
<li class="action"><a href="/web/20221007155747/https://wiki.bash-hackers.org/howto/edit-ed?do=recent" title="Recent Changes [r]" rel="nofollow" accesskey="r" class="menuitem recent"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M15 13h1.5v2.82l2.44 1.41-.75 1.3L15 16.69V13m4-5H5v11h4.67c-.43-.91-.67-1.93-.67-3a7 7 0 0 1 7-7c1.07 0 2.09.24 3 .67V8M5 21a2 2 0 0 1-2-2V5c0-1.11.89-2 2-2h1V1h2v2h8V1h2v2h1a2 2 0 0 1 2 2v6.1c1.24 1.26 2 2.99 2 4.9a7 7 0 0 1-7 7c-1.91 0-3.64-.76-4.9-2H5m11-9.85A4.85 4.85 0 0 0 11.15 16c0 2.68 2.17 4.85 4.85 4.85A4.85 4.85 0 0 0 20.85 16c0-2.68-2.17-4.85-4.85-4.85z"/></svg><span>Recent Changes</span></a></li><li class="action"><a href="/web/20221007155747/https://wiki.bash-hackers.org/howto/edit-ed?do=media&ns=howto" title="Media Manager" rel="nofollow" class="menuitem media"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M7 15l4.5-6 3.5 4.5 2.5-3L21 15m1-11h-8l-2-2H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2M2 6H0v14a2 2 0 0 0 2 2h18v-2H2V6z"/></svg><span>Media Manager</span></a></li><li class="action"><a href="/web/20221007155747/https://wiki.bash-hackers.org/howto/edit-ed?do=index" title="Sitemap [x]" rel="nofollow" accesskey="x" class="menuitem index"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M3 3h6v4H3V3m12 7h6v4h-6v-4m0 7h6v4h-6v-4m-2-4H7v5h6v2H5V9h2v2h6v2z"/></svg><span>Sitemap</span></a></li>
|
|
<li class="divider" role="separator"></li>
|
|
|
|
|
|
<li class="dropdown-header">
|
|
<span class="iconify" data-icon="mdi:file-document-outline"></span> Page Tools </li>
|
|
|
|
<li class="action"><a href="/web/20221007155747/https://wiki.bash-hackers.org/howto/edit-ed?do=" title="Show page [v]" rel="nofollow" accesskey="v" class="menuitem show"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M13 9h5.5L13 3.5V9M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.11.89-2 2-2m9 16v-2H6v2h9m3-4v-2H6v2h12z"/></svg><span>Show page</span></a></li><li class="action"><a href="/web/20221007155747/https://wiki.bash-hackers.org/howto/edit-ed?do=revisions" title="Old revisions [o]" rel="nofollow" accesskey="o" class="menuitem revs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M11 7v5.11l4.71 2.79.79-1.28-4-2.37V7m0-5C8.97 2 5.91 3.92 4.27 6.77L2 4.5V11h6.5L5.75 8.25C6.96 5.73 9.5 4 12.5 4a7.5 7.5 0 0 1 7.5 7.5 7.5 7.5 0 0 1-7.5 7.5c-3.27 0-6.03-2.09-7.06-5h-2.1c1.1 4.03 4.77 7 9.16 7 5.24 0 9.5-4.25 9.5-9.5A9.5 9.5 0 0 0 12.5 2z"/></svg><span>Old revisions</span></a></li><li class="action"><a href="/web/20221007155747/https://wiki.bash-hackers.org/howto/edit-ed?do=backlink" title="Backlinks" rel="nofollow" class="menuitem backlink"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M10.59 13.41c.41.39.41 1.03 0 1.42-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0 5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.982 2.982 0 0 0 0-4.24 2.982 2.982 0 0 0-4.24 0l-3.53 3.53a2.982 2.982 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0 5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.982 2.982 0 0 0 0 4.24 2.982 2.982 0 0 0 4.24 0l3.53-3.53a2.982 2.982 0 0 0 0-4.24.973.973 0 0 1 0-1.42z"/></svg><span>Backlinks</span></a></li><li class="action"><a href="#dokuwiki__top" title="Back to top [t]" rel="nofollow" accesskey="t" class="menuitem top"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" 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 8v12z"/></svg><span>Back to top</span></a></li>
|
|
|
|
</ul>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
<!-- /tools-menu -->
|
|
|
|
<ul class="nav navbar-nav">
|
|
|
|
|
|
<li>
|
|
<span class="dw__actions dw-action-icon">
|
|
<a href="/web/20221007155747/https://wiki.bash-hackers.org/howto/edit-ed?do=register" title="Register" rel="nofollow" class="menuitem register btn btn-success navbar-btn"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M15 14c-2.67 0-8 1.33-8 4v2h16v-2c0-2.67-5.33-4-8-4m-9-4V7H4v3H1v2h3v3h2v-3h3v-2m6 2a4 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 4z"/></svg><span class=""> Register</span></a><a href="/web/20221007155747/https://wiki.bash-hackers.org/howto/edit-ed?do=login&sectok=" title="Log In" rel="nofollow" class="menuitem login btn btn-default navbar-btn"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M10 17.25V14H3v-4h7V6.75L15.25 12 10 17.25M8 2h9a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2v-4h2v4h9V4H8v4H6V4a2 2 0 0 1 2-2z"/></svg><span class=""> Log In</span></a> </span>
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
<!-- navbar -->
|
|
<div align="center">
|
|
<script async src="//web.archive.org/web/20221007155747js_/https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
|
|
<!-- BHORG_BOTTOM -->
|
|
<ins class="adsbygoogle" style="display:inline-block;width:728px;height:90px" data-ad-client="ca-pub-4658830517838678" data-ad-slot="1603598940"></ins>
|
|
<script>
|
|
(adsbygoogle = window.adsbygoogle || []).push({});
|
|
</script>
|
|
</div>
|
|
|
|
</header>
|
|
|
|
<a name="dokuwiki__top" id="dokuwiki__top"></a>
|
|
|
|
<main role="main" class="dw-container pb-5 dokuwiki container-fluid mx-5">
|
|
|
|
<div id="dokuwiki__pageheader">
|
|
|
|
|
|
<!-- breadcrumbs -->
|
|
<nav id="dw__breadcrumbs" class="small">
|
|
|
|
<hr/>
|
|
|
|
<div class="dw__youarehere">
|
|
<ol class="breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList"><li>You are here</li><li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a href="/web/20221007155747/https://wiki.bash-hackers.org/start" itemprop="item" title="start"><span itemprop="name"><span class="iconify" data-icon="mdi:home"></span></span></a></li><li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><a itemprop="item" href="/web/20221007155747/https://wiki.bash-hackers.org/howto/start" class="wikilink1" title="howto:start">HOWTO</a></li><li class="active" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="name"><a itemprop="item" href="/web/20221007155747/https://wiki.bash-hackers.org/howto/edit-ed" class="wikilink1" title="howto:edit-ed">Editing files via scripts with ed</a></span></li></ol> </div>
|
|
|
|
<div class="dw__breadcrumbs hidden-print">
|
|
<ol class="breadcrumb"><li>Trace</li> </div>
|
|
|
|
<hr/>
|
|
|
|
</nav>
|
|
<!-- /breadcrumbs -->
|
|
|
|
<p class="text-right">
|
|
<span class="pageId ml-1 label label-primary">howto:edit-ed</span> </p>
|
|
|
|
<div id="dw__msgarea" class="small">
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="row">
|
|
|
|
|
|
<article id="dokuwiki__content" class="col-sm-12 col-md-12 " itemscope itemtype="http://schema.org/Article" itemref="dw__license">
|
|
|
|
|
|
<!-- page-tools -->
|
|
<nav id="dw__pagetools" class="hidden-print">
|
|
<div class="tools panel panel-default">
|
|
<ul class="nav nav-stacked nav-pills text-muted">
|
|
<li class="action"><a href="/web/20221007155747/https://wiki.bash-hackers.org/howto/edit-ed?do=" title="Show page [v]" rel="nofollow" accesskey="v" class="menuitem show"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M13 9h5.5L13 3.5V9M6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.11.89-2 2-2m9 16v-2H6v2h9m3-4v-2H6v2h12z"/></svg><span>Show page</span></a></li><li class="action"><a href="/web/20221007155747/https://wiki.bash-hackers.org/howto/edit-ed?do=revisions" title="Old revisions [o]" rel="nofollow" accesskey="o" class="menuitem revs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M11 7v5.11l4.71 2.79.79-1.28-4-2.37V7m0-5C8.97 2 5.91 3.92 4.27 6.77L2 4.5V11h6.5L5.75 8.25C6.96 5.73 9.5 4 12.5 4a7.5 7.5 0 0 1 7.5 7.5 7.5 7.5 0 0 1-7.5 7.5c-3.27 0-6.03-2.09-7.06-5h-2.1c1.1 4.03 4.77 7 9.16 7 5.24 0 9.5-4.25 9.5-9.5A9.5 9.5 0 0 0 12.5 2z"/></svg><span>Old revisions</span></a></li><li class="action"><a href="/web/20221007155747/https://wiki.bash-hackers.org/howto/edit-ed?do=backlink" title="Backlinks" rel="nofollow" class="menuitem backlink"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path d="M10.59 13.41c.41.39.41 1.03 0 1.42-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0 5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.982 2.982 0 0 0 0-4.24 2.982 2.982 0 0 0-4.24 0l-3.53 3.53a2.982 2.982 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0 5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.982 2.982 0 0 0 0 4.24 2.982 2.982 0 0 0 4.24 0l3.53-3.53a2.982 2.982 0 0 0 0-4.24.973.973 0 0 1 0-1.42z"/></svg><span>Backlinks</span></a></li><li class="action"><a href="#dokuwiki__top" title="Back to top [t]" rel="nofollow" accesskey="t" class="menuitem top"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" 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 8v12z"/></svg><span>Back to top</span></a></li> </ul>
|
|
</div>
|
|
</nav>
|
|
<!-- /page-tools -->
|
|
|
|
<div class="panel panel-default px-3 py-2" itemprop="articleBody">
|
|
<div class="page panel-body">
|
|
|
|
|
|
<div class="dw-content-page "><!-- content --><div class="dw-content"><p>
|
|
This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong.
|
|
</p>
|
|
<div class="editBox" role="application">
|
|
|
|
<div class="toolbar group">
|
|
<div id="draft__status" class="draft__status"></div>
|
|
<div id="tool__bar" class="tool__bar"></div>
|
|
</div>
|
|
<form id="dw__editform" method="post" action="" accept-charset="utf-8" class=" form-inline"><div class="no">
|
|
<input type="hidden" name="sectok" value=""/><input type="hidden" name="id" value="howto:edit-ed"/><input type="hidden" name="rev" value="0"/><input type="hidden" name="date" value="0"/><input type="hidden" name="prefix" value="."/><input type="hidden" name="suffix" value=""/><input type="hidden" name="changecheck" value="7a725e8fb5e5d511134362e25932c5b2"/><input type="hidden" name="target" value="section"/><textarea name="wikitext" id="wiki__text" dir="auto" class="edit form-control" cols="80" rows="10" tabindex="1" readonly="readonly">
|
|
====== Editing files via scripts with ed ======
|
|
|
|
{{keywords>bash shell scripting arguments file editor edit ed sed}}
|
|
|
|
===== Why ed? =====
|
|
|
|
Like ''sed'', ''ed'' is a line editor. However, if you try to change file contents with ''sed'', and the file is open elsewhere and read by some process, you will find out that GNU ''sed'' and its ''-i'' 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 ''sed'', with "in-place" option available.
|
|
|
|
Why ''ed''?
|
|
* maybe your ''sed'' doesn't support in-place edit
|
|
* maybe you need to be as portable as possible
|
|
* maybe you need to really edit in-file (and not create a new file like GNU ''sed'')
|
|
* last but not least: standard ''ed'' has very good editing and addressing possibilities, compared to standard ''sed''
|
|
|
|
Don't get me wrong, this is **not** meant as anti-''sed'' article! It's just meant to show you another way to do the job.
|
|
|
|
|
|
|
|
|
|
===== Commanding ed =====
|
|
|
|
Since ''ed'' is an interactive text editor, it reads and executes commands that come from ''stdin''. There are several ways to feed our commands to ed:
|
|
|
|
**__Pipelines__**
|
|
<code>
|
|
echo '<ED-COMMANDS>' | ed <FILE>
|
|
</code>
|
|
|
|
To inject the needed newlines, etc. it may be easier to use the builtin command, ''printf'' ("help printf"). Shown here as an example Bash function to prefix text to file content:
|
|
<code>
|
|
|
|
# insertHead "$text" "$file"
|
|
|
|
insertHead() {
|
|
printf '%s\n' H 1i "$1" . w | ed -s "$2"
|
|
}
|
|
</code>
|
|
|
|
**__Here-strings__**
|
|
<code>
|
|
ed <FILE> <<< '<ED-COMMANDS>'
|
|
</code>
|
|
|
|
**__Here-documents__**
|
|
<code>
|
|
ed <FILE> <<EOF
|
|
<ED-COMMANDS>
|
|
EOF
|
|
</code>
|
|
|
|
Which one you prefer is your choice. I will use the here-strings, since it looks best here IMHO.
|
|
|
|
There are other ways to provide input to ''ed''. For example, process substitution. But these should be enough for daily needs.
|
|
|
|
Since ''ed'' wants commands separated by newlines, I'll use a special Bash quoting method, the C-like strings ''<nowiki>$'TEXT'</nowiki>'', as it can interpret a set of various escape sequences and special characters. I'll use the ''-s'' option to make it less verbose.
|
|
|
|
|
|
|
|
===== The basic interface =====
|
|
|
|
Check the ''ed'' manpage for details
|
|
|
|
Similar to ''vi'' or ''vim'', ''ed'' has a "command mode" and an "interactive mode". For non-interactive use, the command mode is the usual choice.
|
|
|
|
Commands to ''ed'' 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.
|
|
|
|
The line addressing is relative to the //current line//. If the edit buffer is not empty, the initial value for the //current line// shall be the last line in the edit buffer, otherwise zero. Generally, the //current line// is the last line affected by a command. All addresses can only address single lines, not blocks of lines!
|
|
|
|
Line addresses or commands using //regular expressions// interpret POSIX Basic Regular Expressions (BRE). A null BRE is used to reference the most recently used BRE. Since ''ed'' addressing is only for single lines, no RE can ever match a newline.
|
|
|
|
|
|
|
|
===== Debugging your ed scripts =====
|
|
|
|
By default, ''ed'' is not very talkative and will simply print a "?" when an error occurs. Interactively you can use the ''h'' command to get a short message explaining the last error. You can also turn on a mode that makes ''ed'' automatically print this message with the ''H'' command. It is a good idea to always add this command at the beginning of your ed scripts:
|
|
|
|
<code>
|
|
bash > ed -s file <<< $'H\n,df'
|
|
?
|
|
script, line 2: Invalid command suffix
|
|
</code>
|
|
|
|
While working on your script, you might make errors and destroy your file, you might be tempted to try your script doing something like:
|
|
<code>
|
|
# Works, but there is better
|
|
|
|
# copy my original file
|
|
cp file file.test
|
|
|
|
# try my script on the file
|
|
ed -s file.test <<< $'H\n<ed commands>\nw'
|
|
|
|
# see the results
|
|
cat file.test
|
|
</code>
|
|
There is a much better way though, you can use the ed command ''p'' to print the file, now your testing would look like:
|
|
|
|
<code>
|
|
ed -s file <<< $'H\n<ed commands>\n,p'
|
|
</code>
|
|
the '','' (comma) in front of the ''p'' command is a shortcut for ''1,$'' which defines an address range for the first to the last line, '',p'' thus means print the whole file, after it has been modified. When your script runs sucessfully, you only have to replace the '',p'' by a ''w''.
|
|
|
|
Of course, even if the file is not modified by the ''p'' command, **it's always a good idea to have a backup copy!**
|
|
|
|
|
|
===== Editing your files =====
|
|
|
|
Most of these things can be done with ''sed''. But there are also things that can't be done in ''sed'' or can only be done with very complex code.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
==== Simple word substitutions ====
|
|
|
|
Like ''sed'', ''ed'' also knows the common ''s/FROM/TO/'' command, and it can also take line-addresses. **If no substitution is made on the addressed lines, it's considered an error.**
|
|
|
|
=== Substitutions through the whole file ===
|
|
|
|
<code>
|
|
ed -s test.txt <<< $',s/Windows(R)-compatible/POSIX-conform/g\nw'
|
|
</code>
|
|
|
|
__Note:__ The comma as single address operator is an alias for ''1,$'' ("all lines").
|
|
|
|
=== Substitutions in specific lines ===
|
|
|
|
On a line containing ''fruits'', do the substitution:
|
|
<code>
|
|
ed -s test.txt <<< $'/fruits/s/apple/banana/g\nw'
|
|
</code>
|
|
|
|
On the 5th line after the line containing ''fruits'', do the substitution:
|
|
<code>
|
|
ed -s test.txt <<< $'/fruits/+5s/apple/banana/g\nw'
|
|
</code>
|
|
|
|
==== Block operations ====
|
|
|
|
=== Delete a block of text ===
|
|
|
|
The simple one is a well-known (by position) block of text:
|
|
<code>
|
|
# delete lines number 2 to 4 (2, 3, 4)
|
|
ed -s test.txt <<< $'2,5d\nw'
|
|
</code>
|
|
|
|
This deletes all lines matching a specific regular expression:
|
|
<code>
|
|
# delete all lines matching foobar
|
|
ed -s test.txt <<< $'g/foobar/d\nw'
|
|
</code>
|
|
g/regexp/ applies the command following it to all the lines matching the regexp
|
|
|
|
|
|
=== Move a block of text ===
|
|
...using the ''m'' command: ''<ADDRESS> m <TARGET-ADDRESS>''
|
|
|
|
This is definitely something that can't be done easily with sed.
|
|
|
|
<code>
|
|
# moving lines 5-9 to the end of the file
|
|
ed -s test.txt <<< $'5,9m$\nw'
|
|
|
|
# moving lines 5-9 to line 3
|
|
ed -s test.txt <<< $'5,9m3\nw'
|
|
</code>
|
|
|
|
=== Copy a block of text ===
|
|
...using the ''t'' command: ''<ADDRESS> t <TARGET-ADDRESS>''
|
|
|
|
You use the ''t'' command just like you use the ''m'' (move) command.
|
|
|
|
<code>
|
|
# make a copy of lines 5-9 and place it at the end of the file
|
|
ed -s test.txt <<< $'5,9t$\nw'
|
|
|
|
# make a copy of lines 5-9 and place it at line 3
|
|
ed -s test.txt <<< $'5,9t3\nw'
|
|
</code>
|
|
|
|
=== Join all lines ===
|
|
...but leave the final newline intact. This is done by an extra command: ''j'' (join).
|
|
|
|
<code>
|
|
ed -s file <<< $'1,$j\nw'
|
|
</code>
|
|
|
|
Compared with two other methods (using ''tr'' or ''sed''), you don't have to delete all newlines and manually add one at the end.
|
|
|
|
|
|
==== File operations ====
|
|
|
|
=== Insert another file ===
|
|
|
|
How do you insert another file? As with ''sed'', you use the ''r'' (read) command. That inserts another file at the line before the last line (and prints the result to stdout - '',p''):
|
|
<code>
|
|
ed -s FILE1 <<< $'$-1 r FILE2\n,p'
|
|
</code>
|
|
|
|
To compare, here's a possible ''sed'' solution which must use Bash arithmetic and the external program ''wc'':
|
|
<code>
|
|
sed "$(($(wc -l < FILE1)-1))r FILE2" FILE1
|
|
|
|
# UPDATE here's one which uses GNU sed's "e" parameter for the s-command
|
|
# it executes the commands found in pattern space. I'll take that as a
|
|
# security risk, but well, sometimes GNU > security, you know...
|
|
sed '${h;s/.*/cat FILE2/e;G}' FILE1
|
|
</code>
|
|
|
|
Another approach, in two invocations of sed, that avoids the use of external commands completely:
|
|
|
|
<code>
|
|
sed $'${s/$/\\n-||-/;r FILE2\n}' FILE1 | sed '0,/-||-/{//!h;N;//D};$G'
|
|
</code>
|
|
|
|
===== Pitfalls =====
|
|
|
|
|
|
|
|
==== ed is not sed ===
|
|
|
|
ed and sed might look similar, but the same command(s) might act differently:
|
|
|
|
**__ /foo/d __**
|
|
|
|
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:
|
|
|
|
<code>
|
|
echo $'1\n1\n3' > file
|
|
|
|
#replace all lines matching 1 by "replacement"
|
|
ed -s file <<< $'g/1/s/1/replacement/\n,p'
|
|
|
|
#replace the first line matching 1 by "replacement"
|
|
#(because it starts searching from the last line)
|
|
ed -s file <<< $'s/1/replacement/\n,p'
|
|
</code>
|
|
|
|
**__ an error stops the script __**
|
|
|
|
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.
|
|
|
|
<code>
|
|
#Gnu sed version
|
|
sed -e '1s/foo/bar/' -e '$a\something' file
|
|
|
|
#First ed version, does nothing if foo is not found on the first line:
|
|
ed -s file <<< $'H\n1s/foo/bar/\na\nsomething\n.\nw'
|
|
</code>
|
|
|
|
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:
|
|
|
|
<code>
|
|
#Second version will add the line with "something" even if foo is not found
|
|
ed -s file <<< $'H\n1g/foo/s/foo/bar/\na\nsomething\n.\nw'
|
|
</code>
|
|
|
|
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
|
|
|
|
==== here documents ====
|
|
|
|
**__ shell parameters are expanded __**
|
|
|
|
If you don't quote the delimiter, $ has a special meaning. This sounds obvious but it's
|
|
easy to forget this fact when you use addresses like $-1 or commands like $a. Either quote the $ or the delimiter:
|
|
<code>
|
|
#fails
|
|
ed -s file << EOF
|
|
$a
|
|
last line
|
|
.
|
|
w
|
|
EOF
|
|
|
|
#ok
|
|
ed -s file << EOF
|
|
\$a
|
|
last line
|
|
.
|
|
w
|
|
EOF
|
|
|
|
#ok again
|
|
ed -s file << 'EOF'
|
|
$a
|
|
last line
|
|
.
|
|
w
|
|
EOF
|
|
</code>
|
|
|
|
**__ "." is not a command __**
|
|
|
|
The . used to terminate the command "a" must be the only thing on the line.
|
|
take care if you indent the commands:
|
|
|
|
<code>
|
|
#ed doesn't care about the spaces before the commands, but the . must be the only thing on the line:
|
|
ed -s file << EOF
|
|
a
|
|
my content
|
|
.
|
|
w
|
|
EOF
|
|
</code>
|
|
|
|
===== Simulate other commands =====
|
|
|
|
Keep in mind that in all the examples below, the entire file will be read into memory.
|
|
|
|
==== A simple grep ====
|
|
|
|
<code>
|
|
ed -s file <<< 'g/foo/p'
|
|
|
|
# equivalent
|
|
ed -s file <<< 'g/foo/'
|
|
</code>
|
|
|
|
The name ''grep'' is derived from the notaion ''g/RE/p'' (global => regular expression => print).
|
|
ref http://www.catb.org/~esr/jargon/html/G/grep.html
|
|
|
|
|
|
|
|
==== wc -l ====
|
|
|
|
Since the default for the ''ed'' "print line number" command is the last line, a simple ''='' (equal sign) will print this line number and thus the number of lines of the file:
|
|
|
|
<code>
|
|
ed -s file <<< '='
|
|
</code>
|
|
|
|
|
|
==== cat ====
|
|
Yea, it's a joke...
|
|
|
|
<code>
|
|
ed -s file <<< $',p'
|
|
</code>
|
|
|
|
...but a similar thing to ''cat'' showing line-endings and escapes can be done with the ''list'' command (l):
|
|
|
|
<code>
|
|
ed -s file <<< $',l'
|
|
</code>
|
|
|
|
|
|
FIXME to be continued
|
|
|
|
===== Links =====
|
|
|
|
Reference:
|
|
* [[http://www.gnu.org/software/ed/manual/ed_manual.html | Gnu ed]] - if we had to guess, you're probably using this one.
|
|
* POSIX [[http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ed.html#tag_20_38 | ed]], [[http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html#tag_20_40 | ex ]], and [[http://pubs.opengroup.org/onlinepubs/9699919799/utilities/vi.html#tag_20_152 | vi ]]
|
|
* [[ http://sdf.lonestar.org/index.cgi?tutorials/ed ]] - ed cheatsheet on sdf.org
|
|
|
|
Misc info / tutorials:
|
|
* [[ 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? ]] - BashFAQ
|
|
* [[ http://wolfram.schneider.org/bsd/7thEdManVol2/edtut/edtut.pdf ]] - Old but still relevant ed tutorial.</textarea>
|
|
<div id="wiki__editbar" class="editBar">
|
|
<div id="size__ctl">
|
|
</div>
|
|
</div>
|
|
</div></form>
|
|
</div>
|
|
</div><!-- /content --></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="small text-right">
|
|
|
|
<span class="docInfo">
|
|
<ul class="list-inline"><li><span class="iconify text-muted" data-icon="mdi:file-document-outline"></span> <span title="howto/edit-ed.txt">howto/edit-ed.txt</span></li><li><span class="iconify text-muted" data-icon="mdi:calendar"></span> Last modified: <span title="2015/08/08 20:00">2015/08/08 20:00</span></li><li class="text-muted">by <bdi>bill_thomson</bdi></li></ul> </span>
|
|
|
|
|
|
</div>
|
|
|
|
</article>
|
|
|
|
|
|
</div>
|
|
|
|
</main>
|
|
|
|
<footer id="dw__footer" class="dw-container py-5 dokuwiki container-fluid">
|
|
<hr/>
|
|
<div align="center">
|
|
<h3><a target="_blank" href="http://web.archive.org/web/20221007155747/http://www.performing-databases.com/">This site is supported by Performing Databases - your experts for database administration</a></h3>
|
|
</div>
|
|
<hr/>
|
|
<div align="center">
|
|
<script async src="//web.archive.org/web/20221007155747js_/https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
|
|
<!-- BHORG_BOTTOM -->
|
|
<ins class="adsbygoogle" style="display:inline-block;width:728px;height:90px" data-ad-client="ca-pub-4658830517838678" data-ad-slot="1603598940"></ins>
|
|
<script>
|
|
(adsbygoogle = window.adsbygoogle || []).push({});
|
|
</script>
|
|
</div>
|
|
|
|
<!-- footer -->
|
|
<div class="dw-container small container-fluid mx-5">
|
|
|
|
|
|
<div class="footer-dw-title">
|
|
<div class="media">
|
|
<div class="media-left">
|
|
<img src="/web/20221007155747im_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/images/logo.png" alt="Bash Hackers Wiki" class="media-object" style="height:32px"/>
|
|
</div>
|
|
<div class="media-body">
|
|
<div class="row">
|
|
<div class="col-sm-2">
|
|
<h4 class="media-heading">Bash Hackers Wiki</h4>
|
|
<p>
|
|
</p>
|
|
</div>
|
|
<div class="col-sm-10">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="footer-license row">
|
|
<hr/>
|
|
<div id="dw__license" class="col-sm-6">
|
|
<p>
|
|
<a href="http://web.archive.org/web/20221007155747/http://www.gnu.org/licenses/fdl-1.3.html" title="GNU Free Documentation License 1.3" target="" itemscope itemtype="http://schema.org/CreativeWork" itemprop="license" rel="license" class="license"><img src="/web/20221007155747im_/https://wiki.bash-hackers.org/lib/tpl/bootstrap3/images/license/gnufdl.png" width="24" height="24" alt="gnufdl"/> </a> </p>
|
|
<p class="small">
|
|
Except where otherwise noted, content on this wiki is licensed under the following license:<br/><a href="http://web.archive.org/web/20221007155747/http://www.gnu.org/licenses/fdl-1.3.html" title="GNU Free Documentation License 1.3" target="" itemscope itemtype="http://schema.org/CreativeWork" itemprop="license" rel="license" class="license">GNU Free Documentation License 1.3</a> </p>
|
|
</div>
|
|
|
|
<div class="col-sm-6">
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
<!-- /footer -->
|
|
</footer>
|
|
|
|
<a href="#dokuwiki__top" class="back-to-top hidden-print btn btn-default" title="skip to content" accesskey="t">
|
|
<span class="iconify" data-icon="mdi:chevron-up"></span> </a>
|
|
|
|
<div id="screen__mode"> <span class="visible-xs-block"></span>
|
|
<span class="visible-sm-block"></span>
|
|
<span class="visible-md-block"></span>
|
|
<span class="visible-lg-block"></span>
|
|
</div>
|
|
|
|
<img src="/web/20221007155747im_/https://wiki.bash-hackers.org/lib/exe/indexer.php?id=howto%3Aedit-ed&1665158283" width="2" height="1" alt=""/>
|
|
</div>
|
|
|
|
</body>
|
|
</html>
|
|
<!--
|
|
FILE ARCHIVED ON 15:57:47 Oct 07, 2022 AND RETRIEVED FROM THE
|
|
INTERNET ARCHIVE ON 11:35:45 Apr 14, 2023.
|
|
JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE.
|
|
|
|
ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C.
|
|
SECTION 108(a)(3)).
|
|
-->
|
|
<!--
|
|
playback timings (ms):
|
|
captures_list: 199.728
|
|
exclusion.robots: 0.255
|
|
exclusion.robots.policy: 0.238
|
|
cdx.remote: 0.099
|
|
esindex: 0.013
|
|
LoadShardBlock: 125.211 (3)
|
|
PetaboxLoader3.datanode: 106.499 (4)
|
|
load_resource: 466.588
|
|
PetaboxLoader3.resolve: 349.157
|
|
--> |