add simple sed command

This commit is contained in:
Antoine Beaupré 2015-10-08 16:13:27 -04:00
parent c4cd2ca34d
commit 4b795fc42f
5 changed files with 341 additions and 0 deletions

View file

@ -38,6 +38,7 @@
- [`git reset-file`](#git-reset-file)
- [`git root`](#git-root)
- [`git scp`](#git-scp)
- [`git sed`](#git-sed)
- [`git setup`](#git-setup)
- [`git squash`](#git-squash)
- [`git summary`](#git-summary)
@ -700,6 +701,10 @@ Remove the latest 3 commits:
git undo 3
```
## git sed
Run grep as directed but replace the given files with the pattern.
## git setup
Set up a git repository (if one doesn't exist), add all files, and make an initial commit. `dir` defaults to the current working directory.

69
bin/git-sed Executable file
View file

@ -0,0 +1,69 @@
#!/bin/sh
usage() {
cat <<EOF
usage: git sed [ -c ] [ -f <flags> ] <search> <replacement>
Run git grep and then send results to sed for replacement with the
given flags, if -f is provided.
Also runs git commit if -c is provided.
EOF
}
# don't commit by default
do_commit() {
true
}
while [ "X$1" != "X" ]; do
case "$1" in
-c|--commit)
if git status --porcelain | grep .; then
echo "you need to commit your changes before running with --commit"
exit 1
fi
do_commit() {
git commit -m"replace $search with $replacement
actual command:
$command" -a
}
;;
-f|--flags)
if [ "X$2" = "X" ]; then
usage
echo "missing argument for $1"
exit 1
fi
shift
flags=$1
;;
-h|--help)
usage
exit
;;
-*)
usage
echo "unkonwn flag: $1"
exit 1
;;
*)
if [ "X$search" = "X" ]; then
search="$1"
elif [ "X$replacement" = "X" ]; then
replacement="$1"
else
usage
echo "too many arguments: $1"
exit 1
fi
;;
esac
shift
done
command="git grep -l '$search' | xargs sed -i 's/$search/$replacement/$flags'"
git grep -l "$search" | xargs sed -i "s/$search/$replacement/$flags"
do_commit

64
man/git-sed.1 Normal file
View file

@ -0,0 +1,64 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "GIT\-SED" "1" "October 2015" "" ""
.
.SH "NAME"
\fBgit\-sed\fR \- replace patterns in git\-controlled files
.
.SH "SYNOPSIS"
\fBgit\-sed\fR [ \-c ] [ \-f \fIflags\fR ] \fIsearch\fR \fIreplacement\fR
.
.SH "DESCRIPTION"
Run git grep and then send results to sed for replacement with the given flags, if \-f is provided\.
.
.P
Also runs git commit if \-c is provided\.
.
.SH "OPTIONS"
\-c
.
.P
commit the resulting changes with a standard commit message detailing the exact command ran\. will fail if there are unstaged changes\.
.
.P
\-f <flags>
.
.P
will use the given regex flags in the sed command (for example "g" replaces multiple times on the same line)\.
.
.P
<search>
.
.P
the pattern passed to grep and to the first part of the sed expression\.
.
.P
<replacement>
.
.P
the replacement passed to sed, the second part of the sed expression\.
.
.SH "EXAMPLES"
.
.nf
$ git sed \'my_function\' \'do_stuff\'
# \.\.\. only does the changes, without committing
$ git commit \-m"use proper function name"
$ git sed \-c \'do_stuff\' \'stuff\'
# \.\. does the changes and a commit
$ git sed \-f g do_stuff stuff
# \.\. g is actually pretty important, otherwise you will miss some
# stuff!
.
.fi
.
.SH "AUTHOR"
Written by Antoine Beaupré <\fIanarcat@debian\.org\fR> from inspiration by https://github\.com/da\-x/git\-search\-replace and http://stackoverflow\.com/questions/9651898/is\-there\-a\-git\-sed\-or\-equivalent
.
.SH "REPORTING BUGS"
<\fIhttps://github\.com/tj/git\-extras/issues\fR>
.
.SH "SEE ALSO"
<\fIhttps://github\.com/tj/git\-extras\fR>

144
man/git-sed.html Normal file
View file

@ -0,0 +1,144 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='content-type' value='text/html;charset=utf8'>
<meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
<title>git-sed(1) - replace patterns in git-controlled files</title>
<style type='text/css' media='all'>
/* style: man */
body#manpage {margin:0}
.mp {max-width:100ex;padding:0 9ex 1ex 4ex}
.mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
.mp h2 {margin:10px 0 0 0}
.mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
.mp h3 {margin:0 0 0 4ex}
.mp dt {margin:0;clear:left}
.mp dt.flush {float:left;width:8ex}
.mp dd {margin:0 0 0 9ex}
.mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
.mp pre {margin-bottom:20px}
.mp pre+h2,.mp pre+h3 {margin-top:22px}
.mp h2+pre,.mp h3+pre {margin-top:5px}
.mp img {display:block;margin:auto}
.mp h1.man-title {display:none}
.mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
.mp h2 {font-size:16px;line-height:1.25}
.mp h1 {font-size:20px;line-height:2}
.mp {text-align:justify;background:#fff}
.mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
.mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
.mp u {text-decoration:underline}
.mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
.mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
.mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
.mp b.man-ref {font-weight:normal;color:#434241}
.mp pre {padding:0 4ex}
.mp pre code {font-weight:normal;color:#434241}
.mp h2+pre,h3+pre {padding-left:0}
ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
ol.man-decor {width:100%}
ol.man-decor li.tl {text-align:left}
ol.man-decor li.tc {text-align:center;letter-spacing:4px}
ol.man-decor li.tr {text-align:right;float:right}
</style>
</head>
<!--
The following styles are deprecated and will be removed at some point:
div#man, div#man ol.man, div#man ol.head, div#man ol.man.
The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
.man-navigation should be used instead.
-->
<body id='manpage'>
<div class='mp' id='man'>
<div class='man-navigation' style='display:none'>
<a href="#NAME">NAME</a>
<a href="#SYNOPSIS">SYNOPSIS</a>
<a href="#DESCRIPTION">DESCRIPTION</a>
<a href="#OPTIONS">OPTIONS</a>
<a href="#EXAMPLES">EXAMPLES</a>
<a href="#AUTHOR">AUTHOR</a>
<a href="#REPORTING-BUGS">REPORTING BUGS</a>
<a href="#SEE-ALSO">SEE ALSO</a>
</div>
<ol class='man-decor man-head man head'>
<li class='tl'>git-sed(1)</li>
<li class='tc'></li>
<li class='tr'>git-sed(1)</li>
</ol>
<h2 id="NAME">NAME</h2>
<p class="man-name">
<code>git-sed</code> - <span class="man-whatis">replace patterns in git-controlled files</span>
</p>
<h2 id="SYNOPSIS">SYNOPSIS</h2>
<p><code>git-sed</code> [ -c ] [ -f <var>flags</var> ] <var>search</var> <var>replacement</var></p>
<h2 id="DESCRIPTION">DESCRIPTION</h2>
<p>Run git grep and then send results to sed for replacement with the
given flags, if -f is provided.</p>
<p>Also runs git commit if -c is provided.</p>
<h2 id="OPTIONS">OPTIONS</h2>
<p> -c</p>
<p> commit the resulting changes with a standard commit message
detailing the exact command ran. will fail if there are unstaged
changes.</p>
<p> -f &lt;flags&gt;</p>
<p> will use the given regex flags in the sed command (for example "g"
replaces multiple times on the same line).</p>
<p> &lt;search&gt;</p>
<p> the pattern passed to grep and to the first part of the sed expression.</p>
<p> &lt;replacement&gt;</p>
<p> the replacement passed to sed, the second part of the sed expression.</p>
<h2 id="EXAMPLES">EXAMPLES</h2>
<pre><code>$ git sed 'my_function' 'do_stuff'
# ... only does the changes, without committing
$ git commit -m"use proper function name"
$ git sed -c 'do_stuff' 'stuff'
# .. does the changes and a commit
$ git sed -f g do_stuff stuff
# .. g is actually pretty important, otherwise you will miss some
# stuff!
</code></pre>
<h2 id="AUTHOR">AUTHOR</h2>
<p>Written by Antoine Beaupré &lt;<a href="&#109;&#x61;&#105;&#x6c;&#116;&#x6f;&#x3a;&#97;&#110;&#x61;&#114;&#99;&#97;&#x74;&#64;&#100;&#x65;&#98;&#x69;&#x61;&#110;&#x2e;&#111;&#x72;&#103;" data-bare-link="true">&#97;&#x6e;&#x61;&#114;&#99;&#97;&#116;&#x40;&#x64;&#x65;&#x62;&#105;&#97;&#110;&#46;&#111;&#114;&#x67;</a>&gt; from
inspiration by https://github.com/da-x/git-search-replace and
http://stackoverflow.com/questions/9651898/is-there-a-git-sed-or-equivalent</p>
<h2 id="REPORTING-BUGS">REPORTING BUGS</h2>
<p>&lt;<a href="https://github.com/tj/git-extras/issues" data-bare-link="true">https://github.com/tj/git-extras/issues</a>&gt;</p>
<h2 id="SEE-ALSO">SEE ALSO</h2>
<p>&lt;<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>&gt;</p>
<ol class='man-decor man-foot man foot'>
<li class='tl'></li>
<li class='tc'>October 2015</li>
<li class='tr'>git-sed(1)</li>
</ol>
</div>
</body>
</html>

59
man/git-sed.md Normal file
View file

@ -0,0 +1,59 @@
git-sed(1) -- replace patterns in git-controlled files
======================================================
## SYNOPSIS
`git-sed` [ -c ] [ -f <flags> ] <search> <replacement>
## DESCRIPTION
Run git grep and then send results to sed for replacement with the
given flags, if -f is provided.
Also runs git commit if -c is provided.
## OPTIONS
-c
commit the resulting changes with a standard commit message
detailing the exact command ran. will fail if there are unstaged
changes.
-f &lt;flags&gt;
will use the given regex flags in the sed command (for example "g"
replaces multiple times on the same line).
&lt;search&gt;
the pattern passed to grep and to the first part of the sed expression.
&lt;replacement&gt;
the replacement passed to sed, the second part of the sed expression.
## EXAMPLES
$ git sed 'my_function' 'do_stuff'
# ... only does the changes, without committing
$ git commit -m"use proper function name"
$ git sed -c 'do_stuff' 'stuff'
# .. does the changes and a commit
$ git sed -f g do_stuff stuff
# .. g is actually pretty important, otherwise you will miss some
# stuff!
## AUTHOR
Written by Antoine Beaupré &lt;<anarcat@debian.org>&gt; from
inspiration by https://github.com/da-x/git-search-replace and
http://stackoverflow.com/questions/9651898/is-there-a-git-sed-or-equivalent
## REPORTING BUGS
&lt;<https://github.com/tj/git-extras/issues>&gt;
## SEE ALSO
&lt;<https://github.com/tj/git-extras>&gt;