I have a file filled with two line couplets, a header line that starts with //
and ends with the line number surrounded by |
, followed by a line of text that is variable in length. Here's an example, where ...
indicates that the file continues with sequential line numbers for many lines.
// * * - - - * |1|
textextextextextextextext
// *- *-* * |2|
textextextextextextextexttextextextext
...
// * - * -* |41232|
textextextextextextext
I would like to find the line number, then replace the header line with >linenumber
. This example file would be:
>1
textextextextextextextext
>2
textextextextextextextexttextextextext
...
>41232
textextextextextextext
I know this probably involves /s
and sed
or awk
with a backreference, but I'm just can't seem to make it work.
CodePudding user response:
A sed one-liner:
sed 's%^//.*|\([0-9]*\)|$%>\1%' file
CodePudding user response:
Yes, sed is a good tool to do it:
sed -E '\%^//.*\|[[:digit:]] \|% s/.*\|([[:digit:]] )\|/>\1/'
Explanation:
\%^//.*\|[[:digit:]] \|%
This is an address, i.e. the followings///
command will only run on matching lines. It matches//
at the start of a line, and somewhere later there must be a number between vertical bars.- The substitution replaces the whole line with the captured number.
CodePudding user response:
Using any awk:
$ awk -F'|' 'NF>1{$0=">" $2} 1' file
>1
textextextextextextextext
>2
textextextextextextextexttextextextext
...
>41232
textextextextextextext
The above assumes that text
never includes |
s.