<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: 0066cc</title>
    <description>The latest articles on DEV Community by 0066cc (@0066cc).</description>
    <link>https://dev.to/0066cc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F302938%2Febe21547-eb18-4c36-bab2-0d3180f74c8c.png</url>
      <title>DEV Community: 0066cc</title>
      <link>https://dev.to/0066cc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/0066cc"/>
    <language>en</language>
    <item>
      <title>Makefile Fundamentals</title>
      <dc:creator>0066cc</dc:creator>
      <pubDate>Fri, 11 Sep 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/0066cc/makefile-fundamentals-422j</link>
      <guid>https://dev.to/0066cc/makefile-fundamentals-422j</guid>
      <description>&lt;h1&gt;
  
  
  What's a makefile?
&lt;/h1&gt;

&lt;p&gt;A makefile is simply a file consisting of one or more scripts, referred to as targets, that can be run by the user using the &lt;code&gt;make&lt;/code&gt; program that is available on most Linux distributions.&lt;/p&gt;

&lt;p&gt;These targets consist of one or more commands that would otherwise need to be repeatedly typed out by hand; hence by bundling these commands together it is possible to automate portions of, or all, of the build process when compiling a program. Additionally, makefiles can also be used to automate testing and general computing processes.&lt;/p&gt;

&lt;h1&gt;
  
  
  Makefile Fundamental Structure
&lt;/h1&gt;

&lt;p&gt;An outline example of a makefile is listed below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;msg="This message was stored in a variable!"
target_name:
    echo "Hi! This is a command that will be run!"
    echo "Each target can run more than one command!"
# This is a comment, it wont show up when you run the makefile.
another_target_name:
    echo "And this is another command that could be run independently!"
    # This is also a valid comment
final_target_name: example.txt
    echo $(msg)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key takeaways from this example are that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each runnable target of your makefile must have a name that ends with a colon (:).&lt;/li&gt;
&lt;li&gt;Each command inside a section must be indented by one tab. Indenting with spaces will result in an error.&lt;/li&gt;
&lt;li&gt;In larger makefiles it may be appropriate to add comments explaining non-obvious commands. Comments can be inserted with a hashtag (#). Comments do not need to be indented the same way regular commands are.&lt;/li&gt;
&lt;li&gt;Placing a file name after the target name can be used to specify file(s) that are needed for the target to run.&lt;/li&gt;
&lt;li&gt;Makefiles also offer support for variables like those seen on the first and last line.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Using A Makefile
&lt;/h1&gt;

&lt;p&gt;If you wish to get a better feel for how makefiles work, try experimenting with changing the target names and ordering. To run the above makefile for yourself:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new blank text file in a directory you have access to.&lt;/li&gt;
&lt;li&gt;Open the new file in a text editor.&lt;/li&gt;
&lt;li&gt;Either copy or type out the example makefile listed above.&lt;/li&gt;
&lt;li&gt;Save the file as 'makefile' and close the file.&lt;/li&gt;
&lt;li&gt;Open a terminal and navigate to the directory containing the makefile.&lt;/li&gt;
&lt;li&gt;Type '&lt;code&gt;make target_name&lt;/code&gt;' and run the command.&lt;/li&gt;
&lt;li&gt;Type '&lt;code&gt;make another_target_name&lt;/code&gt;' and run the command.&lt;/li&gt;
&lt;li&gt;Type '&lt;code&gt;make final_target_name&lt;/code&gt;' and run the command.&lt;/li&gt;
&lt;li&gt;Type '&lt;code&gt;make&lt;/code&gt;' and run the command.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Output of Step 6:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo "Hi! This is a command that will be run!"
Hi! This is a command that will be run!
echo "Each target can run more than one command!"
Each target can run more than one command!

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Output of Step 7:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo "And this is another command that could be run independently!"
And this is another command that could be run independently!

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Output of Step 8:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make: *** No rule to make target 'example.txt', needed by 'makefile'. Stop.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Requirements
&lt;/h3&gt;

&lt;p&gt;You should have received an error when you attempted to run this target. Why is that? The reason for this error is that a requirement has been specified for this target; in order for this target to run the file specified immediately after the target name must be present (in this example 'example.txt').&lt;/p&gt;

&lt;h4&gt;
  
  
  Output of Step 8 (Corrected):
&lt;/h4&gt;

&lt;p&gt;In order to make this target run create a file called 'example.txt' in the same directory as the makefile. 'Example.txt' can contain anything or even be blank but as long as the file exists, it meets the requirements of the makefile.&lt;/p&gt;

&lt;p&gt;Running the makefile now presents the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo "This message was stored in a variable!"
This message was stored in a variable!

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Output of Step 9:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo "Hi! This is a command that will be run!"
Hi! This is a command that will be run!
echo "Each target can run more than one command!"
Each target can run more than one command!

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  No target Specified
&lt;/h2&gt;

&lt;p&gt;It can also be important to remember that simply typing &lt;code&gt;make&lt;/code&gt; with no additional specifications will automatically attempt to run the first target listed in the makefile. In this instance, running 'make' will output the same result as &lt;code&gt;make target_name&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; make
echo "Hi! This is a command that will be run!"
Hi! This is a command that will be run!
echo "Each target can run more than one command!"
Each target can run more than one command!

&amp;gt; make target_name
echo "Hi! This is a command that will be run!"
Hi! This is a command that will be run!
echo "Each target can run more than one command!"
Each target can run more than one command!

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Additional Features
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Hide Displaying Commands
&lt;/h2&gt;

&lt;p&gt;By default, makefiles will automatically display the command that is being run, like how the &lt;code&gt;echo&lt;/code&gt; command is shown before actually echoing the text:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; make
echo "Hi!"
Hi!

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To suppress showing the command that is being run and just display the output, prepend the command in question with an at-symbol(&lt;code&gt;@&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make:
    @echo "Hi!"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Doing so will now output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; make
Hi!

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Variables
&lt;/h2&gt;

&lt;p&gt;It's also possible to define variables in a makefile, these can be used to include additional information that can be passed to a command or used to alter how a target should run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Declaring and Using Variables
&lt;/h3&gt;

&lt;p&gt;Variables must be declared outside any targets like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;msg="Hello!"
text="Another variable!"
make:
    echo $(msg)
    echo $(text)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once a variable has been declared, it can then be used in a target by enclosing the variable name with a dollar-sign and brackets &lt;code&gt;$()&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passing Variables
&lt;/h3&gt;

&lt;p&gt;It is possible to pass variables into the makefile from the command-line when a target is run like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; make msg="New value!"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using the same makefile as above will now display:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; make msg="New value!"
echo "New value!"
New value!
echo "Another variable!"
Another variable!

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By passing variables this way, they do not need to be declared and initialised in the makefile itself, instead it is possible to simply use the variable as if it has already been declared like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make:
    echo $(msg)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note how &lt;code&gt;msg&lt;/code&gt; has not been declared at the top of the file; if you attempt to run the makefile with no additional information then the following will be displayed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; make
echo

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As the variable has not been given a value, nothing is printed to the screen. In order to give &lt;code&gt;msg&lt;/code&gt; a value, the makefile must be ran like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; make msg="New value!"
echo "New value!"
New value!

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Custom Makefile Name
&lt;/h2&gt;

&lt;p&gt;Although &lt;code&gt;makefile&lt;/code&gt; is the default filename that will be checked for when you run &lt;code&gt;make&lt;/code&gt;, it is possible to use an alternative filename.To do so, when running the make command include the &lt;code&gt;-f&lt;/code&gt; switch followed by the name of the file you want to use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; make -f alternativeMake print_msg

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above, the &lt;code&gt;make&lt;/code&gt; command is used on a file called &lt;code&gt;alternativeMake&lt;/code&gt; and attempts to run a target called &lt;code&gt;print_msg&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Additional Resources
&lt;/h1&gt;

&lt;p&gt;That concludes the fundamentals of makefiles, this guide covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Makefile structure and syntax.&lt;/li&gt;
&lt;li&gt;Requirements&lt;/li&gt;
&lt;li&gt;Declaring, using, and passing variables.&lt;/li&gt;
&lt;li&gt;Modifying output with command suppression.&lt;/li&gt;
&lt;li&gt;Custom makefile names&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are interested in learning about even more of the features that makefiles offer (such as conditional targets, functions, and recursively expanded variables), consider consulting the &lt;a href="https://www.gnu.org/software/make/manual/make.html"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>linux</category>
      <category>tips</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Ed Cheat Sheet</title>
      <dc:creator>0066cc</dc:creator>
      <pubDate>Fri, 11 Sep 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/0066cc/ed-cheat-sheet-3ka9</link>
      <guid>https://dev.to/0066cc/ed-cheat-sheet-3ka9</guid>
      <description>&lt;h1&gt;
  
  
  What's Ed?
&lt;/h1&gt;

&lt;p&gt;This post is not intended as a general introduction to Ed however the essentials you may need to know are that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ed was the text editor written by &lt;a href="https://en.wikipedia.org/wiki/Ken_Thompson"&gt;Ken Thompson&lt;/a&gt; while initially developing Unix.&lt;/li&gt;
&lt;li&gt;It is famed for its terseness, often giving no error messages or any form of communication to the user at all.&lt;/li&gt;
&lt;li&gt;With just a few commands you can probably match the speed you work in in your regular text editor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A more general view of Ed can be found &lt;a href="https://en.wikipedia.org/wiki/Ed_(text_editor)"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cheat Sheet
&lt;/h1&gt;

&lt;p&gt;Note that X and Y are used to indicate user-given values. &lt;br&gt;
FILE is used to indicate a user-given filename.&lt;/p&gt;

&lt;h2&gt;
  
  
  Single Commands
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;(Any number)&lt;/td&gt;
&lt;td&gt;Set current line to given value if line exists.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P&lt;/td&gt;
&lt;td&gt;Display prompt.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;p&lt;/td&gt;
&lt;td&gt;Print current line.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;Same as 'p' but print with line numbers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;Display verbose errors.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;Append : insert new line and start editing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;i&lt;/td&gt;
&lt;td&gt;Insert: start editing on line above current line.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;Replace current line.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;w&lt;/td&gt;
&lt;td&gt;Write (save) file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;z&lt;/td&gt;
&lt;td&gt;Print as much of the file as will fit on the screen. Set current line as last visible line.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;l&lt;/td&gt;
&lt;td&gt;Place a &lt;code&gt;$&lt;/code&gt; at the end of a command to show where a line ends, useful for showing trailing white space.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;u&lt;/td&gt;
&lt;td&gt;Undo last command.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$&lt;/td&gt;
&lt;td&gt;Go to last line of file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;Go to next line.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Go to previous line.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;=&lt;/td&gt;
&lt;td&gt;Current line number.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.&lt;/td&gt;
&lt;td&gt;Exit edit mode.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;,&lt;/td&gt;
&lt;td&gt;Symbol that indicates the entire file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;;&lt;/td&gt;
&lt;td&gt;Current line to end of file.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Compound Commands
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;wq&lt;/td&gt;
&lt;td&gt;Write and quit.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;,p&lt;/td&gt;
&lt;td&gt;Print whole file to screen.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;,n&lt;/td&gt;
&lt;td&gt;Print current line with line number.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XmY&lt;/td&gt;
&lt;td&gt;Move line X and insert it after line Y.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;,np&lt;/td&gt;
&lt;td&gt;Print numbered listing of all lines.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XzY&lt;/td&gt;
&lt;td&gt;Starting on line X, print the next Y lines.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Xd&lt;/td&gt;
&lt;td&gt;Delete line X.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Xr FILE&lt;/td&gt;
&lt;td&gt;Read a file in and insert it at line X.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X,Yj&lt;/td&gt;
&lt;td&gt;Join line X to Y.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XtY&lt;/td&gt;
&lt;td&gt;Copy line X to Y.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XW FILE&lt;/td&gt;
&lt;td&gt;Append line X to another file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X,YW FILE&lt;/td&gt;
&lt;td&gt;Append lines X through Y to another file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;f X&lt;/td&gt;
&lt;td&gt;When saving the file, save it as X (effectively a save as option).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;e X&lt;/td&gt;
&lt;td&gt;Switch to editing file X.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E X&lt;/td&gt;
&lt;td&gt;Force switch to other file without checking if current file has been saved.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X,Yw FILE&lt;/td&gt;
&lt;td&gt;Save the text between lines X and Y to another file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;!X&lt;/td&gt;
&lt;td&gt;Run command X outside of &lt;code&gt;ed&lt;/code&gt; and return.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;!!&lt;/td&gt;
&lt;td&gt;Run previous external command again.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;r !X&lt;/td&gt;
&lt;td&gt;Read external command X into the current file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;w !X&lt;/td&gt;
&lt;td&gt;Write your current program to another file/program. This functions similarly to Unix Pipes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kX&lt;/td&gt;
&lt;td&gt;Assign a bookmark called X. Bookmarks can only be assigned to the current line.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'X&lt;/td&gt;
&lt;td&gt;Go to bookmark X.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/X/&lt;/td&gt;
&lt;td&gt;Search for X on current line.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;g/X/p&lt;/td&gt;
&lt;td&gt;Search for X on all lines and print matching lines.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;g/X/np&lt;/td&gt;
&lt;td&gt;Search for X on all lines and print matching lines with line numbers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$=&lt;/td&gt;
&lt;td&gt;Print last line number.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;.=&lt;/td&gt;
&lt;td&gt;Display current line number.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>learning</category>
      <category>linux</category>
      <category>tips</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
