Stream editor Usage: sed [-hinNs-] [ -f scriptfile ] [ -e script ] [ script ] [ file1 file2 ... ] sed is a special text editor for use on streams of data where it cycles, reading a line from input, applying the editing operations you've specified, and writing the result to stdout. The input is read in a single pass and each line is acted on only once. The editing script can be specified on the command line or, if it's long and complex, in a file. If you want to combine a script on the command line with any other script, you must use the -e option. The editing operations available are the usual search/replace, insert/delete, etc. With each operation, you generally can specify the lines in the file it should affect either by line number or matching a pattern or a range of lines. Options: -h Help. (This screen.) -f scriptfile Read the script from a file. Multiple -f options are allowed and the scripts are concatenated. -e script Take the following argument word as a script. Multiple -e options are also allowed. -i Ignore character case. -n Don't automatically write the contents of the edit buffer to stdout at the end of each cycle. -N Normalize any input to use the UNIX convention of a simple \n character to terminate each line, then re-expand the text on output to follow the \r\n convention used on a PC. This option is useful in porting sed scripts from a UNIX system. -s Read the script from stdin. (The input stream to be edited must be in a file.) -- End of options. Scripts: The script is written as a series of commands, each separated from the next by a line end or a semicolon. The format of a command is: [ address1 [ , address2 ] ] operation Spacing between fields is arbitrary: you can use spaces or tabs between fields or have none at all as you prefer. Here are the fields: address is a line number or regular expression to be matched. When a regular expression is used as an address, it's normally written as /regexp/ but it's also possible to use the syntax \?regexp? where ? is any character. Zero- or One-Address Operations: If you don't give an address, the operation is applied to all lines. If you give a single address, the operation is done on each line that matches. Ranges: When you give two addresses, you define a range. A range can be a single line, e.g., "3,3", or a whole group of lines. If the addresses involve pattern matching, e.g., /^#ifdef/,/^#endif/ the range might occur over and over in the input and will be acted on each time. Most operations, e.g., search/replace, are done against all lines in the range. The exceptions are i\ (insert), which is acted on at entry to the range; a\ (append), and q (quit), which are acted on at the end; and c\ (change), which deletes all the lines in the range but doesn't write any output until the end of the range. operation is one of the 28 basic operations provided, together with any arguments it takes. Operations: There are two buffers in sed: the edit buffer and the hold buffer. Most of the editing operations work on the edit buffer, doing search/replace operations, translating characters, and saving or retrieving text in the hold buffer. Sed automatically puts each new line into the edit buffer (along with its trailing line end) at the start of each cycle unless there was something left over after a D (delete head) command. A second group of operations provide ways of inserting blocks of static text. The next group of operations provide rudimentary ways of condition-testing and branching and of nesting a series of operations together. Finally there operations for printing and doing other i/o and for other miscellaneous things. Basic Editing: d Delete this section. Start the next cycle. D Delete from the beginning of edit buffer through and including the first line ending. If there's text remaining, immediately start over at the top of the script without reading a new line. Otherwise, start the next cycle. s/.../.../[ngpw] Search/replace using regular expressions. In the replace string, "&" means whatever the search string matched. "\n", where n is a number, means whatever matched that tagged expression in the search string. Other escape sequences, such as "\r" to mean Carriage Return, can also be used, just as they are in a regular expression search string (described below). The search and replace strings are shown here delimited with /, but you may choose any character you like that doesn't occur in either string. The following modifiers are accepted: n A decimal number from 1 to 65,535. Substitute for just the n'th occurrence of the search pattern. g Global. Substitute all occurrences. p Print the edit buffer if a change was made. w file Write the edit buffer onto the end of the file if a change was made. y/.../.../[c] Translate all occurrences of characters in the first string to the corresponding characters in the second string. As in the tr utility, ranges are allowed, as in "y/a-z/A-Z/". The optional "c" flag can be used to complement the input range. Either string can contain \r and \n characters. If the first string is longer than the second, all the extra characters are mapped to the last character in the replacement string or to a null if there was none. If the second string is longer, the extras are ignored. Using the Hold Buffer: g Get from the hold buffer. Replace the current contents of the edit buffer. G Get from the hold buffer and paste onto the end of the edit buffer. h Hold. Replace the contents of the hold buffer with a copy of the edit buffer. H Append to hold. Copy the edit buffer contents onto the end of the hold buffer. x Exchange the edit and hold buffers. Inserting blocks of Static Text: a\ Append the text to the output at the end text of the cycle if this is the last line in the range. All but the last line of text should have a "\" just before the \r\n sequence at the end of each line. c\ Change this section to read as shown in the text following text. Start the next cycle. i\ Insert. Immediately copy the following text text to stdout if this is the start of the range. Condition-Testing, Branching and Grouping operations: b label Branch to the label elsewhere in the script. (If no label is given, it's to the end of the script.) q If this is the end of the range, quit. t label Branch to the label if search/replace changes have been made since the most recent input line was read or a t operation was run. : label Label. (No address prefix is allowed.) { } Group a series of operations together. Printing: = Write the line number to stdout. l List the contents of the edit buffer in C language style with escape sequences for binary characters. p Print. Write the contents of the edit buffer to stdout. P Print from the beginning of the edit buffer through and including the first line ending. #n Suppress any automatic output at the end of each cyle. Other I/O operations: n Next line. Write the contents of the edit buffer to stdout, dump any appended text and read a new line from stdin to the edit buffer. N Read the next line onto the end of the edit buffer with a \r\n sequence in between. r file Copy the contents of this file to stdout at the end of the cycle. w file Write the edit butter onto the end of the file, creating it if it doesn't exist. Miscellaneous: ! operation Don't apply this function unless the addressing DOESN'T match. Invert the line selections. ; Null statement. # comment Comments and blank lines are ignored. If multiple a\ (append) or r (read file) instructions are executed (or the same one is iterated in a loop), a new entry is made on the end of a list of all the appended text blocks to be copied to stdout at the end of the cycle. When the end of the cycle is finally reached, the whole list is dumped, in order from the top. Regular Expressions: Search patterns are specified as regular expressions like those used by grep. Regular expressions are written in this notation, in decreasing precedence: c Any ordinary character matches itself. \c Match the literal character c. Certain characters are treated specially: \a Audible Alert (Bell) \r Carriage Return \b BackSpace \t Tab \f Form Feed \v Vertical Tab \n NewLine \\ Single BackSlash \x The next one or two characters are treated as hex digits specifying the character code. ^ Beginning of line. $ End of line. . Match any single character. [...] Match any single character in the list. [^...] Match any single character not in the list. \n Match whatever literal text the n'th tagged \(...\) expression matched. r* Match zero or more occurrences of r. r\{n\} Match exactly n occurrences of r, where n is an unsigned decimal integer. r\{n,\} Match at least n occurrences of r. r\{n,m\} Match at least n, but not more than m occurrences of r. r\{,m\} Match at most m occurrences of r. r1r2 Match expression r1 followed by r2. \(r\) Tagged regular expression. Match the pattern inside the \(...\), and remember the literal text that matched. A regular expression pattern cannot contain Nulls but it can contain NewLine or CarriageReturn characters (which may be useful with the N or G commands.) When typing a regular expression on the command line, remember that $, [, ], ^, ( and ) have special meaning to Hamilton C shell. Put single quotes around the string to turn off that special meaning. Also, even inside quotes, type ^^ to mean ^ except when it immediately follows [. Also, / at the beginning of a word on the command line is taken as introducing an option. If you mean it to be the start of a script, use the "--" option ahead of it. |