For a full list of BASHing data blog posts see the index page.
How to number copy/pasted commands
When I copy commands from a terminal (with or without their outputs) and paste them into a text file or word-processing document, I sometimes want those commands numbered and any output indented. Here's an example, a series of commands as they appear in my terminal:
If I highlight those three commands and their output, then middle-click paste into a LibreOffice Writer document (left) or Geany text editor (right), I get this:
But what I'd like is this:
This numbering and re-formatting lends itself to what I call a "CoPa" operation, for Copy, Paste. That's a script or function which takes the contents of the primary clipboard (the one loaded when you highlight text) from the xclip utility and does something to the contents before loading them back into xclip for middle-click pasting.
xclip -o | [do something to stdin] | xclip
In this case I use a CoPa function called "fancy" that lives in my .bashrc file:
fancy() { xclip -o | awk '{print /^\$ / ? ++c"\x20\x20\x20"$0 : "\x20\x20\x20\x20\x20"$0}' | xclip; }
To work "fancy" I first highight the lines in my terminal that I want to copy:
Then I enter "fancy", which returns me to a new prompt:
Now I can paste my numbered and reformatted lines:
xclip -o | awk '{print /^\$ / ? ++c"\x20\x20\x20"$0 : "\x20\x20\x20\x20\x20"$0}' | xclip
The first command in "fancy" is xclip -o, which sends the contents of the primary clipboard to stdout.
The slightly cryptic AWK command is an if/else written "ternary style" and prints each line with a modification. If the line begins with my prompt, which is the "$" character followed by a plain space (/^\$ /), then AWK prints an incremented counter number (++c) followed by 3 spaces followed by the original line ("\x20\x20\x20;"$0 ). Otherwise AWK prints 5 spaces followed by the original line ("\x20\x20\x20\x20\x20"$0).
The output from the AWK command is piped to xclip for pasting.
I've used the hexadecimal code for a plain space (20) because it's easier to see and count than an invisible space!
Last update: 2020-08-05
The blog posts on this website are licensed under a
Creative Commons Attribution-NonCommercial 4.0 International License