sed
sed (stream editor) is a Unix utility that (a) parses text files and (b) implements a programming language which can apply textual transformations to such files. It reads input files line by line (sequentially), applying the operation which has been specified via the command line (or a sed script), and then outputs the line. It was developed from 1973 to 1974 as a Unix utility by Lee E. McMahon of Bell Labs,[1] and is available today for most operating systems.[2]
History
sed is one of the very early Unix commands built for command line processing of data files. It evolved as the natural successor to the popular grep command.[3] Cousin to the later AWK, sed allowed powerful and interesting data processing to be done by shell scripts.
sed and AWK are often cited as the progenitors and inspiration for Perl. The s / / / syntax shown below is part of Perl's syntax and originated with ed, the precursor to sed.
sed's language does not have variables and has only primitive GOTO and branching functionality; nevertheless, the language is Turing-complete.[3] [4]
GNU sed added several new features. The most well-known is in-place editing of files (i.e., replace the original file with the result of applying the sed program), which was later included in BSD sed too. This feature is nowadays used instead of ed scripts: for example,
sed -i 's/abc/def/' file
can be used instead of
ed file 1,$ s/abc/def/ w q
Super-sed is an extended version of sed that includes regular expressions compatible with Perl.
Another variant of sed is minised, originally reverse-engineered from the 4.1BSD sed by Eric S. Raymond and currently maintained by René Rebe. minised was used by the GNU project until the GNU project wrote a new version of sed based on the new GNU regular expression library. The current minised contains some extensions to BSD sed but is not as feature-rich as GNU sed. Its advantage is that it is very fast and uses little memory.[citation needed] It is used on embedded systems and is the version of sed provided with Minix.[citation needed]
Usage
The following example shows a typical use of sed, where the -e option indicates that the sed expression follows:
sed -e 's/oldstuff/newstuff/g' inputFileName > outputFileName
In many versions, the -e is not required to precede the expression. The s stands for substitute. The g stands for global, which means that all matching occurrences in the line would be replaced. The regular expression (i.e. pattern) to be searched is placed after the first delimiting symbol (slash here) and the replacement follows the second symbol. Slash is the conventional symbol. Any other could be used to make syntax more readable if it does not occur in the pattern or replacement (see below).
Under Unix, sed is often used as a filter in a pipeline:
generate_data | sed -e 's/x/y/g'
That is, generate the data, and then make the small change of replacing x with y.
Several substitutions or other commands can be put together in a file called, for example, subst.sed and then be applied using the -f option to read the commands from the file:
sed -f subst.sed inputFileName > outputFileName
Besides substitution, other forms of simple processing are possible. For example, the following uses the d command to delete lines that are either blank or only contain spaces:
sed -e '/^ *$/d' inputFileName
This example used some of the following regular expression metacharacters:
- The caret (
^
) matches the beginning of the line. - The dollar sign (
$
) matches the end of the line. - The asterisk (
*
) matches zero or more occurrences of the previous character.
Complex sed constructs are possible, allowing it to serve as a simple, but highly specialised, programming language. Flow of control, for example, can be managed by the use of a label (a colon followed by a string) and the branch instruction b. An instruction b followed by a valid label name will move processing to the block following that label. If the label does not exist then the branch will end the script.
Samples
To delete a line containing a specific word from the file use:
sed '/yourword/d' yourfile
To delete only the word use:
sed 's/yourword//g' yourfile
To delete two words for a file simultaneously use:
sed -e 's/firstword//g' -e 's/secondword//g' yourfile
or
sed 's/firstword//g;s/secondword//g' yourfile
In the next example, sed, which usually only works on one line, removes newlines from sentences where the second sentence starts with one space. Consider the following text:
This is my cat my cat's name is betty This is my dog my dog's name is frank
The sed script below will turn it into:
This is my cat my cat's name is betty This is my dog my dog's name is frank
Here's the script:
sed 'N;s/\n / /;P;D;'
- (N) add the next line to the work buffer
- (s) substitute
- (/\n /) match: \n (newline character in Unix) and one space
- (/ /) replace with: one space
- (P) print the top line of the work buffer
- (D) delete the top line from the work buffer and run the script again
More useful and complex is transposing an XML table into a CSV:
sed -rn '{s/ *//g;/<field *\/>/{s/.*//g;H};/<field/{s/<\/*field>//g;H};/<\/row>/{x;s/^\r*\n//;s/\r*\n\r*/","/g;s/^([^\r\n]*)/"\1"/;p};/<row/{s/.*//g;x;}}' yourfile.xml
First clear out all the extraneous whitespace:
s/ *//g
If the current line is a blank <field> line, add a blank line to the hold space:
/<field *\/>/{s/.*//g;H}
If there is an actual value in the field, strip the xml and add the value to the hold space:
/<field>/{s/<\/*field>//g;H}
If it is the end of a row (</row>), then get the hold space, replace the newlines with '","', add quotes to the beginning and end and then print the line:
/<\/row>/{x;s/^\r*\n//;s/\r*\n\r*/","/g;s/^([^\r\n]*)/"\1"/;p}
If it is the beginning of a row, clear the hold space by adding a blank line:
/<row/{s/.*//g;x;}
Exotic examples
Despite the inherent limitations, sed scripts exist for games as sokoban, arkanoid,[5] and an implementation of tetris.[6]
See also
Search Wikibooks | Wikibooks has a book on the topic of |
- GSAR
- List of Unix programs
- Tr (Unix)
- iExpress Windows utility uses .sed as file name extension.
References
- ↑ "Frequently-Asked Questions about sed, the stream editor". http://sed.sourceforge.net/sedfaq2.html#s2.1. Retrieved 2008-05-13.
- ↑ "Frequently-Asked Questions about sed, the stream editor". http://sed.sourceforge.net/sedfaq2.html#s2.2. Retrieved 2008-05-13.
- ↑ 3.0 3.1
"On the Early History and Impact of Unix". http://www.columbia.edu/~rh120/ch001j.c11.
Cite error: Invalid
<ref>
tag; name "tur_paper" defined multiple times with different content - ↑ "Turing.sed". http://sed.sourceforge.net/grabbag/scripts/turing.sed.
- ↑ "SourceForge.net". http://sed.sourceforge.net/#gamez.
- ↑ "Author's livejournal page". http://uuner.livejournal.com/55238.html.
Further reading
- Dale Dougherty & Arnold Robbins (March 1997). sed & awk (2nd Edition ed.). O'Reilly. ISBN 1-56592-225-5.
- Arnold Robbins (June 2002). sed and awk Pocket Reference (2nd Edition ed.). O'Reilly and Associates. ISBN 0-596-00352-8.
- Peter Patsis (1998-12-30). UNIX AWK and SED Programmer's Interactive Workbook (UNIX Interactive Workbook). Prentice Hall. ISBN 0-13-082675-8.
- Harvey Mudd College
- Sourceforge.net, the sed FAQ
- GNU sed manual
- Grymoire.com
External links
- Major sources for sed scripts, files, usage
- Roger Chang's SED and Shell Scripts
- A calculator written in sed
- The sed tutorial from Grymoire
- More on the address command and sub-matched replacements
- Minised homepage
- PCRE – Perl Compatible Regular Expressions
- The A-Z of Programming Languages: AWK
- Top 'sed' commands – Usage examples
- sedtutorial.com
- FPGREP and FPSED: Unix utilities implemented in field programmable hardware
als:Sed cs:Sed de:Sed (Unix) es:Sed (informática) fr:Stream Editor hu:Sed nl:Stream Editor ja:Sed (コンピュータ) pl:Sed (program) pt:Sed ro:Sed ru:Sed fi:Sed tr:Sed (yazılım) uk:Sed zh:Sed
If you like SEOmastering Site, you can support it by - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 and more...
- Pages with reference errors
- All articles with unsourced statements
- Articles with unsourced statements from May 2008
- Articles with invalid date parameter in template
- Pages with broken file links
- Text-oriented programming languages
- Scripting languages
- Unix text processing utilities
- Unix SUS2008 utilities
- Free compilers and interpreters