Number Lines, Right-Aligned Numbers
This is the script:
sed '=' file.txt | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /'
But first, we’ll concentrate on this slightly simpler version:
sed '=' file.txt | sed 'N; s/^/ /; s/\n/ /'
We changed s/ *\(.\{6,\}\)\n/\1 / with s/\n/ /.
If you run the command above, you’ll get a result similar to this:
1 foo
2 bar
...
9 consetetur
10 sadipscing
11 elitr,
...
99 lorem
100 ipsum
101 dolor
As you see, the numbers are on the left, left-aligned.
sed '=' file.txt
just produces:
1
foo
2
bar
...
Then, we pipe that output to
sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /'
Let’s break that further down.
N
will just cause the pattern space to contain 1\nfoo, then 2\nbar, etc.
Then comes the next command:
s/^/ /
That will substitute the beginning of the pattern space with 6 spaces. And what we have now is something like:
1
foo
2
bar
...
999
lorem
Note that the numbers are still on the left, left-aligned, and not on the left but right-aligned, which is our final goal.
That is, they look like
n
nn
nnn
nnnn
but we want them to look like this
n
nn
nnn
nnnn
Finally, we have s/\n/ /. This is what causes the line number to appear in
the same line as the line of text itself.
Now, we go back and replace the simpler s/\n/ / with the trickier
s/ *\(.\{6,\}\)\n/\1 /. The advantage of this version is that the line numbers
are still on the left, but right-alinged:
1 foo
2 bar
...
9 consetetur
10 sadipscing
11 elitr,
...
99 lorem
100 ipsum
101 dolor
Just to make it clear, the full command now is
sed '=' file.txt | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /'
sed 'N' will cause the pattern space to contain something like
3\nfoo, then
s/^/ / makes the pattern space contain
3\nfoo, and finally, s/
*\(.\{6,\}\)\n/ will match (starting from the end) the newline, then digit 3
and five spaces.
If the pattern space contains
974\nbar,
's/ *\(.\{6,\}\)\n/' will match the newline, the tree digits 9, 7 and 4, and
tree spaces. Note that in all the cases, altough * is greedy,
only the necessary numbers of spaces are matched in * so
that the entire expression finds “zero or more spaces, followed by six
characters, followed by a newline.”