Annotation of 43BSDReno/share/doc/usd/13.edadv/ae2, revision 1.1

1.1     ! root        1: .\"    @(#)ae2 6.1 (Berkeley) 5/22/86
        !             2: .\"
        !             3: .NH
        !             4: SPECIAL CHARACTERS
        !             5: .PP
        !             6: The editor
        !             7: .UL ed
        !             8: is the primary interface to the system
        !             9: for many people, so
        !            10: it is worthwhile to know
        !            11: how to get the most out of
        !            12: .UL ed
        !            13: for the least effort.
        !            14: .PP
        !            15: The next few sections will discuss
        !            16: shortcuts
        !            17: and labor-saving devices.
        !            18: Not all of these will be instantly useful
        !            19: to any one person, of course,
        !            20: but a few will be,
        !            21: and the others should give you ideas to store
        !            22: away for future use.
        !            23: And as always,
        !            24: until you try these things,
        !            25: they will remain theoretical knowledge,
        !            26: not something you have confidence in.
        !            27: .SH
        !            28: The List command `l'
        !            29: .PP
        !            30: .UL ed
        !            31: provides two commands for printing the contents of the lines
        !            32: you're editing.
        !            33: Most people are familiar with
        !            34: .UL p ,
        !            35: in combinations like
        !            36: .P1
        !            37: 1,$p
        !            38: .P2
        !            39: to print all the lines you're editing,
        !            40: or
        !            41: .P1
        !            42: s/abc/def/p
        !            43: .P2
        !            44: to change 
        !            45: `abc'
        !            46: to
        !            47: `def'
        !            48: on the current line.
        !            49: Less familiar is the
        !            50: .ul
        !            51: list
        !            52: command
        !            53: .UL l
        !            54: (the letter `\fIl\|\fR'),
        !            55: which gives slightly more information than
        !            56: .UL p .
        !            57: In particular,
        !            58: .UL l
        !            59: makes visible characters that are normally invisible,
        !            60: such as tabs and backspaces.
        !            61: If you list a line that contains some of these,
        !            62: .UL l
        !            63: will print each tab as
        !            64: .UL \z\(mi>
        !            65: and each backspace as
        !            66: .UL \z\(mi< .\(dg
        !            67: .FS
        !            68: \(dg These composite characters are created by overstriking a minus
        !            69: and a > or <, so they only appear as < or > on display terminals.
        !            70: .FE
        !            71: This makes it much easier to correct the sort of typing mistake
        !            72: that inserts extra spaces adjacent to tabs,
        !            73: or inserts a backspace followed by a space.
        !            74: .PP
        !            75: The
        !            76: .UL l
        !            77: command
        !            78: also `folds' long lines for printing _
        !            79: any line that exceeds 72 characters is printed on multiple lines;
        !            80: each printed line except the last is terminated by a backslash 
        !            81: .UL \*e ,
        !            82: so you can tell it was folded.
        !            83: This is useful for printing long lines on short terminals.
        !            84: .PP
        !            85: Occasionally the
        !            86: .UL l
        !            87: command will print in a line a string of numbers preceded by a backslash,
        !            88: such as \*e07 or \*e16.
        !            89: These combinations are used to make visible characters that normally don't print,
        !            90: like form feed or vertical tab or bell.
        !            91: Each such combination is a single character.
        !            92: When you see such characters, be wary _
        !            93: they may have surprising meanings when printed on some terminals.
        !            94: Often their presence means that your finger slipped while you were typing;
        !            95: you almost never want them.
        !            96: .SH
        !            97: The Substitute Command `s'
        !            98: .PP
        !            99: Most of the next few sections will be taken up with a discussion
        !           100: of the
        !           101: substitute
        !           102: command
        !           103: .UL s .
        !           104: Since this is the command for changing the contents of individual
        !           105: lines,
        !           106: it probably has the most complexity of any 
        !           107: .UL ed 
        !           108: command,
        !           109: and the most potential for effective use.
        !           110: .PP
        !           111: As the simplest place to begin,
        !           112: recall the meaning of a trailing
        !           113: .UL g
        !           114: after a substitute command.
        !           115: With
        !           116: .P1
        !           117: s/this/that/
        !           118: .P2
        !           119: and
        !           120: .P1
        !           121: s/this/that/g
        !           122: .P2
        !           123: the
        !           124: first
        !           125: one replaces the
        !           126: .ul
        !           127: first
        !           128: `this' on the line
        !           129: with `that'.
        !           130: If there is more than one `this' on the line,
        !           131: the second form
        !           132: with the trailing
        !           133: .UL g
        !           134: changes
        !           135: .ul
        !           136: all
        !           137: of them.
        !           138: .PP
        !           139: Either form of the
        !           140: .UL s
        !           141: command can be followed by
        !           142: .UL p
        !           143: or
        !           144: .UL l
        !           145: to `print' or `list' (as described in the previous section)
        !           146: the contents of the line:
        !           147: .P1
        !           148: s/this/that/p
        !           149: s/this/that/l
        !           150: s/this/that/gp
        !           151: s/this/that/gl
        !           152: .P2
        !           153: are all legal, and mean slightly different things.
        !           154: Make sure you know what the differences are.
        !           155: .PP
        !           156: Of course, any
        !           157: .UL s
        !           158: command can be preceded by one or two `line numbers'
        !           159: to specify that the substitution is to take place
        !           160: on a group of lines. 
        !           161: Thus
        !           162: .P1
        !           163: 1,$s/mispell/misspell/
        !           164: .P2
        !           165: changes the 
        !           166: .ul
        !           167: first
        !           168: occurrence of
        !           169: `mispell' to `misspell' on every line of the file.
        !           170: But
        !           171: .P1
        !           172: 1,$s/mispell/misspell/g
        !           173: .P2
        !           174: changes 
        !           175: .ul
        !           176: every
        !           177: occurrence in every line
        !           178: (and this is more likely to be what you wanted in this
        !           179: particular case).
        !           180: .PP
        !           181: You should also notice that if you add a
        !           182: .UL p
        !           183: or
        !           184: .UL l
        !           185: to the end of any of these substitute commands,
        !           186: only the last line that got changed will be printed,
        !           187: not all the lines.
        !           188: We will talk later about how to print all the lines
        !           189: that were modified.
        !           190: .SH
        !           191: The Undo Command `u'
        !           192: .PP
        !           193: Occasionally you will make a substitution in a line,
        !           194: only to realize too late that it was a ghastly mistake.
        !           195: The `undo' command
        !           196: .UL u
        !           197: lets you `undo' the last substitution:
        !           198: the last line that was substituted can be restored to
        !           199: its previous state by typing the command
        !           200: .P1
        !           201: u
        !           202: .P2
        !           203: .SH
        !           204: The Metacharacter `\*.'
        !           205: .PP
        !           206: As you have undoubtedly noticed
        !           207: when you use
        !           208: .UL ed ,
        !           209: certain characters have unexpected meanings
        !           210: when they occur in the left side of a substitute command,
        !           211: or in a search for a particular line.
        !           212: In the next several sections, we will talk about
        !           213: these special characters,
        !           214: which are often called `metacharacters'.
        !           215: .PP
        !           216: The first one is the period `\*.'.
        !           217: On the left side of a substitute command,
        !           218: or in a search with `/.../',
        !           219: `\*.' stands for
        !           220: .ul
        !           221: any
        !           222: single character.
        !           223: Thus the search
        !           224: .P1
        !           225: /x\*.y/
        !           226: .P2
        !           227: finds any line where `x' and `y' occur separated by
        !           228: a single character, as in
        !           229: .P1
        !           230: x+y
        !           231: x\-y
        !           232: x\*(BLy
        !           233: x\*.y
        !           234: .P2
        !           235: and so on.
        !           236: (We will use \*(BL to stand for a space whenever we need to
        !           237: make it visible.)
        !           238: .PP
        !           239: Since `\*.' matches a single character,
        !           240: that gives you a way to deal with funny characters
        !           241: printed by
        !           242: .UL l .
        !           243: Suppose you have a line that, when printed with the
        !           244: .UL l
        !           245: command, appears as
        !           246: .P1
        !           247:  ....   th\*e07is   ....
        !           248: .P2
        !           249: and you want to get rid of the 
        !           250: \*e07
        !           251: (which represents the bell character, by the way).
        !           252: .PP
        !           253: The most obvious solution is to try
        !           254: .P1
        !           255: s/\*e07//
        !           256: .P2
        !           257: but this will fail. (Try it.)
        !           258: The brute force solution, which most people would now take,
        !           259: is to re-type the entire line.
        !           260: This is guaranteed, and is actually quite a reasonable tactic
        !           261: if the line in question isn't too big,
        !           262: but for a very long line,
        !           263: re-typing is a bore.
        !           264: This is where the metacharacter `\*.' comes in handy.
        !           265: Since `\*e07' really represents a single character,
        !           266: if we say
        !           267: .P1
        !           268: s/th\*.is/this/
        !           269: .P2
        !           270: the job is done.
        !           271: The `\*.' matches the mysterious character between the `h' and the `i',
        !           272: .ul
        !           273: whatever it is.
        !           274: .PP
        !           275: Bear in mind that since `\*.' matches any single character,
        !           276: the command
        !           277: .P1
        !           278: s/\*./,/
        !           279: .P2
        !           280: converts the first character on a line into a `,',
        !           281: which very often is not what you intended.
        !           282: .PP
        !           283: As is true of many characters in
        !           284: .UL ed ,
        !           285: the `\*.' has several meanings, depending
        !           286: on its context.
        !           287: This line shows all three:
        !           288: .P1
        !           289: \&\*.s/\*./\*./
        !           290: .P2
        !           291: The first `\*.' is a line number,
        !           292: the number of
        !           293: the line we are editing,
        !           294: which is called `line dot'.
        !           295: (We will discuss line dot more in Section 3.)
        !           296: The second `\*.' is a metacharacter
        !           297: that matches any single character on that line.
        !           298: The third `\*.' is the only one that really is
        !           299: an honest literal period.
        !           300: On the
        !           301: .ul
        !           302: right
        !           303: side of a substitution, `\*.'
        !           304: is not special.
        !           305: If you apply this command to the line
        !           306: .P1
        !           307: Now is the time\*.
        !           308: .P2
        !           309: the result will
        !           310: be
        !           311: .P1
        !           312: \&\*.ow is the time\*.
        !           313: .P2
        !           314: which is probably not what you intended.
        !           315: .SH
        !           316: The Backslash `\*e'
        !           317: .PP
        !           318: Since a period means `any character',
        !           319: the question naturally arises of what to do
        !           320: when you really want a period.
        !           321: For example, how do you convert the line
        !           322: .P1
        !           323: Now is the time\*.
        !           324: .P2
        !           325: into
        !           326: .P1
        !           327: Now is the time?
        !           328: .P2
        !           329: The backslash `\*e' does the job.
        !           330: A backslash turns off any special meaning that the next character
        !           331: might have; in particular,
        !           332: `\*e\*.' converts the `\*.' from a `match anything'
        !           333: into a period, so
        !           334: you can use it to replace
        !           335: the period in
        !           336: .P1
        !           337: Now is the time\*.
        !           338: .P2
        !           339: like this:
        !           340: .P1
        !           341: s/\*e\*./?/
        !           342: .P2
        !           343: The pair of characters `\*e\*.' is considered by
        !           344: .UL ed
        !           345: to be a single real period.
        !           346: .PP
        !           347: The backslash can also be used when searching for lines
        !           348: that contain a special character.
        !           349: Suppose you are looking for a line that contains
        !           350: .P1
        !           351: \&\*.PP
        !           352: .P2
        !           353: The search
        !           354: .P1
        !           355: /\*.PP/
        !           356: .P2
        !           357: isn't adequate, for it will find
        !           358: a line like
        !           359: .P1
        !           360: THE APPLICATION OF ...
        !           361: .P2
        !           362: because the `\*.' matches the letter `A'.
        !           363: But if you say
        !           364: .P1
        !           365: /\*e\*.PP/
        !           366: .P2
        !           367: you will find only lines that contain `\*.PP'.
        !           368: .PP
        !           369: The backslash can also be used to turn off special meanings for
        !           370: characters other than `\*.'.
        !           371: For example, consider finding a line that contains a backslash.
        !           372: The search
        !           373: .P1
        !           374: /\*e/
        !           375: .P2
        !           376: won't work,
        !           377: because the `\*e' isn't a literal `\*e', but instead means that the second `/'
        !           378: no longer \%delimits the search.
        !           379: But by preceding a backslash with another one,
        !           380: you can search for a literal backslash.
        !           381: Thus
        !           382: .P1
        !           383: /\*e\*e/
        !           384: .P2
        !           385: does work.
        !           386: Similarly, you can search for a forward slash `/' with
        !           387: .P1
        !           388: /\*e//
        !           389: .P2
        !           390: The backslash turns off the meaning of the immediately following `/' so that
        !           391: it doesn't terminate the /.../ construction prematurely.
        !           392: .PP
        !           393: As an exercise, before reading further, find two substitute commands each of which will
        !           394: convert the line
        !           395: .P1
        !           396: \*ex\*e\*.\*ey
        !           397: .P2
        !           398: into the line
        !           399: .P1
        !           400: \*ex\*ey
        !           401: .P2
        !           402: .PP
        !           403: Here are several solutions;
        !           404: verify that each works as advertised.
        !           405: .P1
        !           406: s/\*e\*e\*e\*.//
        !           407: s/x\*.\*./x/
        !           408: s/\*.\*.y/y/
        !           409: .P2
        !           410: .PP
        !           411: A couple of miscellaneous notes about
        !           412: backslashes and special characters.
        !           413: First, you can use any character to delimit the pieces
        !           414: of an
        !           415: .UL s
        !           416: command: there is nothing sacred about slashes.
        !           417: (But you must use slashes for context searching.)
        !           418: For instance, in a line that contains a lot of slashes already, like
        !           419: .P1
        !           420: //exec //sys.fort.go // etc...
        !           421: .P2
        !           422: you could use a colon as the delimiter _
        !           423: to delete all the slashes, type
        !           424: .P1
        !           425: s:/::g
        !           426: .P2
        !           427: .PP
        !           428: Second, if # and @ are your character erase and line kill characters,
        !           429: you have to type \*e# and \*e@;
        !           430: this is true whether you're talking to
        !           431: .UL ed
        !           432: or any other program.
        !           433: .PP
        !           434: When you are adding text with
        !           435: .UL a
        !           436: or
        !           437: .UL i
        !           438: or
        !           439: .UL c ,
        !           440: backslash is not special, and you should only put in
        !           441: one backslash for each one you really want.
        !           442: .SH
        !           443: The Dollar Sign `$'
        !           444: .PP
        !           445: The next metacharacter, the `$', stands for `the end of the line'.
        !           446: As its most obvious use, suppose you have the line
        !           447: .P1
        !           448: Now is the
        !           449: .P2
        !           450: and you wish to add the word `time' to the end.
        !           451: Use the $ like this:
        !           452: .P1
        !           453: s/$/\*(BLtime/
        !           454: .P2
        !           455: to get
        !           456: .P1
        !           457: Now is the time
        !           458: .P2
        !           459: Notice that a space is needed before `time' in
        !           460: the substitute command,
        !           461: or you will get
        !           462: .P1
        !           463: Now is thetime
        !           464: .P2
        !           465: .PP
        !           466: As another example, replace the second comma in
        !           467: the following line with a period without altering the first:
        !           468: .P1
        !           469: Now is the time, for all good men,
        !           470: .P2
        !           471: The command needed is
        !           472: .P1
        !           473: s/,$/\*./
        !           474: .P2
        !           475: The $ sign here provides context to make specific which comma we mean.
        !           476: Without it, of course, the
        !           477: .UL s
        !           478: command would operate on the first comma to produce
        !           479: .P1
        !           480: Now is the time\*. for all good men,
        !           481: .P2
        !           482: .PP
        !           483: As another example, to convert
        !           484: .P1
        !           485: Now is the time\*.
        !           486: .P2
        !           487: into
        !           488: .P1
        !           489: Now is the time?
        !           490: .P2
        !           491: as we did earlier, we can use
        !           492: .P1
        !           493: s/\*.$/?/
        !           494: .P2
        !           495: .PP
        !           496: Like `\*.', the `$'
        !           497: has multiple meanings depending on context.
        !           498: In the line
        !           499: .P1
        !           500: $s/$/$/
        !           501: .P2
        !           502: the first `$' refers to the
        !           503: last line of the file,
        !           504: the second refers to the end of that line,
        !           505: and the third is a literal dollar sign,
        !           506: to be added to that line.
        !           507: .SH
        !           508: The Circumflex `^'
        !           509: .PP
        !           510: The circumflex (or hat or caret)
        !           511: `^' stands for the beginning of the line.
        !           512: For example, suppose you are looking for a line that begins
        !           513: with `the'.
        !           514: If you simply say 
        !           515: .P1
        !           516: /the/
        !           517: .P2
        !           518: you will in all likelihood find several lines that contain `the' in the middle before
        !           519: arriving at the one you want.
        !           520: But with
        !           521: .P1
        !           522: /^the/
        !           523: .P2
        !           524: you narrow the context, and thus arrive at the desired one
        !           525: more easily.
        !           526: .PP
        !           527: The other use of `^' is of course to enable you to insert
        !           528: something at the beginning of a line:
        !           529: .P1
        !           530: s/^/\*(BL/
        !           531: .P2
        !           532: places a space at the beginning of the current line.
        !           533: .PP
        !           534: Metacharacters can be combined. To search for a
        !           535: line that contains 
        !           536: .ul
        !           537: only 
        !           538: the characters
        !           539: .P1
        !           540: \&\*.PP
        !           541: .P2
        !           542: you can use the command
        !           543: .P1
        !           544: /^\*e\*.PP$/
        !           545: .P2
        !           546: .SH
        !           547: The Star `*'
        !           548: .PP
        !           549: Suppose you have a line that looks like this:
        !           550: .P1
        !           551: \fItext \fR x                y \fI text \fR
        !           552: .P2
        !           553: where 
        !           554: .ul
        !           555: text 
        !           556: stands
        !           557: for lots of text,
        !           558: and there are some indeterminate number of spaces between the
        !           559: .UL x
        !           560: and the
        !           561: .UL y .
        !           562: Suppose the job is to replace all the spaces between
        !           563: .UL x
        !           564: and
        !           565: .UL y
        !           566: by a single space.
        !           567: The line is too long to retype, and there are too many spaces
        !           568: to count.
        !           569: What now?
        !           570: .PP
        !           571: This is where the metacharacter `*'
        !           572: comes in handy.
        !           573: A character followed by a star
        !           574: stands for as many consecutive occurrences of that
        !           575: character as possible.
        !           576: To refer to all the spaces at once, say
        !           577: .P1
        !           578: s/x\*(BL*y/x\*(BLy/
        !           579: .P2
        !           580: The construction
        !           581: `\*(BL*'
        !           582: means
        !           583: `as many spaces as possible'.
        !           584: Thus `x\*(BL*y' means `an x, as many spaces as possible, then a y'.
        !           585: .PP
        !           586: The star can be used with any character, not just space.
        !           587: If the original example was instead
        !           588: .P1
        !           589: \fItext \fR x--------y \fI text \fR
        !           590: .P2
        !           591: then all `\-' signs can be replaced by a single space
        !           592: with the command
        !           593: .P1
        !           594: s/x-*y/x\*(BLy/
        !           595: .P2
        !           596: .PP
        !           597: Finally, suppose that the line was
        !           598: .P1
        !           599: \fItext \fR x\*.\*.\*.\*.\*.\*.\*.\*.\*.\*.\*.\*.\*.\*.\*.\*.\*.\*.y \fI text \fR
        !           600: .P2
        !           601: Can you see what trap lies in wait for the unwary?
        !           602: If you blindly type
        !           603: .P1
        !           604: s/x\*.*y/x\*(BLy/
        !           605: .P2
        !           606: what will happen?
        !           607: The answer, naturally, is that it depends.
        !           608: If there are no other x's or y's on the line,
        !           609: then everything works, but it's blind luck, not good management.
        !           610: Remember that `\*.' matches
        !           611: .ul
        !           612: any
        !           613: single character?
        !           614: Then `\*.*' matches as many single characters as possible,
        !           615: and unless you're careful, it can eat up a lot more of the line
        !           616: than you expected.
        !           617: If the line was, for example, like this:
        !           618: .P1
        !           619: \fItext  \fRx\fI  text  \fR x\*.\*.\*.\*.\*.\*.\*.\*.\*.\*.\*.\*.\*.\*.\*.\*.y \fI  text  \fRy\fI  text  \fR
        !           620: .P2
        !           621: then saying
        !           622: .P1
        !           623: s/x\*.*y/x\*(BLy/
        !           624: .P2
        !           625: will take everything from the
        !           626: .ul
        !           627: first
        !           628: `x' to the
        !           629: .ul
        !           630: last
        !           631: `y',
        !           632: which, in this example, is undoubtedly more than you wanted.
        !           633: .PP
        !           634: The solution, of course, is to turn off the special meaning of
        !           635: `\*.' with
        !           636: `\*e\*.':
        !           637: .P1
        !           638: s/x\*e\*.*y/x\*(BLy/
        !           639: .P2
        !           640: Now everything works, for `\*e\*.*' means `as many
        !           641: .ul
        !           642: periods
        !           643: as possible'.
        !           644: .PP
        !           645: There are times when the pattern `\*.*' is exactly what you want.
        !           646: For example, to change
        !           647: .P1
        !           648: Now is the time for all good men ....
        !           649: .P2
        !           650: into
        !           651: .P1
        !           652: Now is the time\*.
        !           653: .P2
        !           654: use `\*.*' to eat up everything after the `for':
        !           655: .P1
        !           656: s/\*(BLfor\*.*/\*./
        !           657: .P2
        !           658: .PP
        !           659: There are a couple of additional pitfalls associated with `*' that you should be aware of.
        !           660: Most notable is the fact that `as many as possible' means
        !           661: .ul
        !           662: zero
        !           663: or more.
        !           664: The fact that zero is a legitimate possibility is
        !           665: sometimes rather surprising.
        !           666: For example, if our line contained
        !           667: .P1
        !           668: \fItext \fR xy \fI text \fR x             y \fI text \fR
        !           669: .P2
        !           670: and we said
        !           671: .P1
        !           672: s/x\*(BL*y/x\*(BLy/
        !           673: .P2
        !           674: the
        !           675: .ul
        !           676: first
        !           677: `xy' matches this pattern, for it consists of an `x',
        !           678: zero spaces, and a `y'.
        !           679: The result is that the substitute acts on the first `xy',
        !           680: and does not touch the later one that actually contains some intervening spaces.
        !           681: .PP
        !           682: The way around this, if it matters, is to specify a pattern like
        !           683: .P1
        !           684: /x\*(BL\*(BL*y/
        !           685: .P2
        !           686: which says `an x, a space, then as many more spaces as possible, then a y',
        !           687: in other words, one or more spaces.
        !           688: .PP
        !           689: The other startling behavior of `*' is again related to the fact
        !           690: that zero is a legitimate number of occurrences of something
        !           691: followed by a star. The command
        !           692: .P1
        !           693: s/x*/y/g
        !           694: .P2
        !           695: when applied to the line
        !           696: .P1
        !           697: abcdef
        !           698: .P2
        !           699: produces
        !           700: .P1
        !           701: yaybycydyeyfy
        !           702: .P2
        !           703: which is almost certainly not what was intended.
        !           704: The reason for this behavior is that zero is a legal number
        !           705: of matches,
        !           706: and there are no x's at the beginning of the line
        !           707: (so that gets converted into a `y'),
        !           708: nor between the `a' and the `b'
        !           709: (so that gets converted into a `y'), nor ...
        !           710: and so on.
        !           711: Make sure you really want zero matches;
        !           712: if not, in this case write
        !           713: .P1
        !           714: s/xx*/y/g
        !           715: .P2
        !           716: `xx*' is one or more x's.
        !           717: .SH
        !           718: The Brackets `[ ]'
        !           719: .PP
        !           720: Suppose that you want to delete any numbers
        !           721: that appear
        !           722: at the beginning of all lines of a file.
        !           723: You might first think of trying a series of commands like
        !           724: .P1
        !           725: 1,$s/^1*//
        !           726: 1,$s/^2*//
        !           727: 1,$s/^3*//
        !           728: .P2
        !           729: and so on,
        !           730: but this is clearly going to take forever if the numbers are at all long.
        !           731: Unless you want to repeat the commands over and over until
        !           732: finally all numbers are gone,
        !           733: you must get all the digits on one pass.
        !           734: This is the purpose of the brackets [ and ].
        !           735: .PP
        !           736: The construction
        !           737: .P1
        !           738: [0123456789]
        !           739: .P2
        !           740: matches any single digit _
        !           741: the whole thing is called a `character class'.
        !           742: With a character class, the job is easy.
        !           743: The pattern `[0123456789]*' matches zero or more digits (an entire number), so
        !           744: .P1
        !           745: 1,$s/^[0123456789]*//
        !           746: .P2
        !           747: deletes all digits from the beginning of all lines.
        !           748: .PP
        !           749: Any characters can appear within a character class,
        !           750: and just to confuse the issue there are essentially no special characters
        !           751: inside the brackets;
        !           752: even the backslash doesn't have a special meaning.
        !           753: To search for special characters, for example, you can say
        !           754: .P1
        !           755: /[\*.\*e$^[]/
        !           756: .P2
        !           757: Within [...], the `[' is not special.
        !           758: To get a `]' into a character class,
        !           759: make it the first character.
        !           760: .PP
        !           761: It's a nuisance to have to spell out the digits,
        !           762: so you can abbreviate them as
        !           763: [0\-9];
        !           764: similarly, [a\-z] stands for the lower case letters,
        !           765: and
        !           766: [A\-Z] for upper case.
        !           767: .PP
        !           768: As a final frill on character classes, you can specify a class
        !           769: that means `none of the following characters'.
        !           770: This is done by beginning the class with a `^':
        !           771: .P1
        !           772: [^0-9]
        !           773: .P2
        !           774: stands for `any character 
        !           775: .ul
        !           776: except
        !           777: a digit'.
        !           778: Thus you might find the first line that doesn't begin with a tab or space
        !           779: by a search like
        !           780: .P1
        !           781: /^[^(space)(tab)]/
        !           782: .P2
        !           783: .PP
        !           784: Within a character class,
        !           785: the circumflex has a special meaning 
        !           786: only if it occurs at the beginning.
        !           787: Just to convince yourself, verify that
        !           788: .P1
        !           789: /^[^^]/
        !           790: .P2
        !           791: finds a line that doesn't begin with a circumflex.
        !           792: .SH
        !           793: The Ampersand `&'
        !           794: .PP
        !           795: The ampersand `&' is used primarily to save typing.
        !           796: Suppose you have the line
        !           797: .P1
        !           798: Now is the time
        !           799: .P2
        !           800: and you want to make it
        !           801: .P1
        !           802: Now is the best time
        !           803: .P2
        !           804: Of course you can always say
        !           805: .P1
        !           806: s/the/the best/
        !           807: .P2
        !           808: but it seems silly to have to repeat the `the'.
        !           809: The `&' is used to eliminate the repetition.
        !           810: On the
        !           811: .ul
        !           812: right
        !           813: side of a substitute, the ampersand means `whatever
        !           814: was just matched', so you can say
        !           815: .P1
        !           816: s/the/& best/
        !           817: .P2
        !           818: and the `&' will stand for `the'.
        !           819: Of course this isn't much of a saving if the thing
        !           820: matched is just `the', but if it is something truly long or awful,
        !           821: or if it is something like `.*'
        !           822: which matches a lot of text,
        !           823: you can save some tedious typing.
        !           824: There is also much less chance of making a typing error
        !           825: in the replacement text.
        !           826: For example, to parenthesize a line,
        !           827: regardless of its length,
        !           828: .P1
        !           829: s/\*.*/(&)/
        !           830: .P2
        !           831: .PP
        !           832: The ampersand can occur more than once on the right side:
        !           833: .P1
        !           834: s/the/& best and & worst/
        !           835: .P2
        !           836: makes
        !           837: .P1
        !           838: Now is the best and the worst time
        !           839: .P2
        !           840: and
        !           841: .P1
        !           842: s/\*.*/&? &!!/
        !           843: .P2
        !           844: converts the original line into
        !           845: .P1
        !           846: Now is the time? Now is the time!!
        !           847: .P2
        !           848: .PP
        !           849: To get a literal ampersand, naturally the backslash is used to turn off the special meaning:
        !           850: .P1
        !           851: s/ampersand/\*e&/
        !           852: .P2
        !           853: converts the word into the symbol.
        !           854: Notice that `&' is not special on the left side
        !           855: of a substitute, only on the
        !           856: .ul
        !           857: right 
        !           858: side.
        !           859: .SH
        !           860: Substituting Newlines
        !           861: .PP
        !           862: .UL ed
        !           863: provides a facility for splitting a single line into two or more shorter lines by `substituting in a newline'.
        !           864: As the simplest example, suppose a line has gotten unmanageably long
        !           865: because of editing (or merely because it was unwisely typed).
        !           866: If it looks like
        !           867: .P1
        !           868: \fItext \fR   xy  \fI text \fR
        !           869: .P2
        !           870: you can break it between the `x' and the `y' like this:
        !           871: .P1
        !           872: s/xy/x\*e
        !           873: y/
        !           874: .P2
        !           875: This is actually a single command,
        !           876: although it is typed on two lines.
        !           877: Bearing in mind that `\*e' turns off special meanings,
        !           878: it seems relatively intuitive that a `\*e' at the end of
        !           879: a line would make the newline there
        !           880: no longer special.
        !           881: .PP
        !           882: You can in fact make a single line into several lines
        !           883: with this same mechanism.
        !           884: As a large example, consider underlining the word `very'
        !           885: in a long line
        !           886: by splitting `very' onto a separate line,
        !           887: and preceding it by the
        !           888: .UL roff
        !           889: or
        !           890: .UL nroff
        !           891: formatting command `.ul'.
        !           892: .P1
        !           893: \fItext \fR a very big \fI text \fR
        !           894: .P2
        !           895: The command
        !           896: .P1
        !           897: s/\*(BLvery\*(BL/\*e
        !           898: \&.ul\*e
        !           899: very\*e
        !           900: /
        !           901: .P2
        !           902: converts the line into four shorter lines,
        !           903: preceding the word `very' by the
        !           904: line
        !           905: `.ul',
        !           906: and eliminating the spaces around the `very',
        !           907: all at the same time.
        !           908: .PP
        !           909: When a newline is substituted
        !           910: in, dot is left pointing at the last line created.
        !           911: .PP
        !           912: .SH
        !           913: Joining Lines
        !           914: .PP
        !           915: Lines may also be joined together,
        !           916: but this is done with the
        !           917: .UL j
        !           918: command
        !           919: instead of
        !           920: .UL s .
        !           921: Given the lines
        !           922: .P1
        !           923: Now is
        !           924: \*(BLthe time
        !           925: .P2
        !           926: and supposing that dot is set to the first of them,
        !           927: then the command
        !           928: .P1
        !           929: j
        !           930: .P2
        !           931: joins them together.
        !           932: No blanks are added,
        !           933: which is why we carefully showed a blank 
        !           934: at the beginning of the second line.
        !           935: .PP
        !           936: All by itself,
        !           937: a
        !           938: .UL j
        !           939: command
        !           940: joins line dot to line dot+1,
        !           941: but any contiguous set of lines can be joined.
        !           942: Just specify the starting and ending line numbers.
        !           943: For example,
        !           944: .P1
        !           945: 1,$jp
        !           946: .P2
        !           947: joins all the lines into one big one
        !           948: and prints it.
        !           949: (More on line numbers in Section 3.)
        !           950: .SH
        !           951: Rearranging a Line with \*e( ... \*e)
        !           952: .PP
        !           953: (This section should be skipped on first reading.)
        !           954: Recall that `&' is a shorthand that stands for whatever
        !           955: was matched by the left side of an
        !           956: .UL s
        !           957: command.
        !           958: In much the same way you can capture separate pieces
        !           959: of what was matched;
        !           960: the only difference is that you have to specify
        !           961: on the left side just what pieces you're interested in.
        !           962: .PP
        !           963: Suppose, for instance, that 
        !           964: you have a file of lines that consist of names in the form
        !           965: .P1
        !           966: Smith, A. B.
        !           967: Jones, C.
        !           968: .P2
        !           969: and so on,
        !           970: and you want the initials to precede the name, as in
        !           971: .P1
        !           972: A. B. Smith
        !           973: C. Jones
        !           974: .P2
        !           975: It is possible to do this with a series of editing commands,
        !           976: but it is tedious and error-prone.
        !           977: (It is instructive to figure out how it is done, though.)
        !           978: .PP
        !           979: The alternative
        !           980: is to `tag' the pieces of the pattern (in this case,
        !           981: the last name, and the initials),
        !           982: and then rearrange the pieces.
        !           983: On the left side of a substitution,
        !           984: if part of the pattern is enclosed between
        !           985: \*e( and \*e),
        !           986: whatever matched that part is remembered,
        !           987: and available for use on the right side.
        !           988: On the right side,
        !           989: the symbol `\*e1' refers to whatever
        !           990: matched the first \*e(...\*e) pair,
        !           991: `\*e2' to the second \*e(...\*e),
        !           992: and so on.
        !           993: .PP
        !           994: The command
        !           995: .P1
        !           996: 1,$s/^\*e([^,]*\*e),\*(BL*\*e(\*.*\*e)/\*e2\*(BL\*e1/
        !           997: .P2
        !           998: although hard to read, does the job.
        !           999: The first \*e(...\*e) matches the last name,
        !          1000: which is any string up to the comma;
        !          1001: this is referred to on the right side with `\*e1'.
        !          1002: The second \*e(...\*e) is whatever follows
        !          1003: the comma and any spaces,
        !          1004: and is referred to as `\*e2'.
        !          1005: .PP
        !          1006: Of course, with any editing sequence this complicated,
        !          1007: it's foolhardy to simply run it and hope.
        !          1008: The global commands 
        !          1009: .UL g
        !          1010: and 
        !          1011: .UL v
        !          1012: discussed in section 4
        !          1013: provide a way for you to print exactly those
        !          1014: lines which were affected by the
        !          1015: substitute command,
        !          1016: and thus verify that it did what you wanted
        !          1017: in all cases.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.