Если у вас все в порядке с решением non-sed: с GNU awk для 3-го аргумента в match ():
$ cat tst.awk
{
match($0,/^(\s*(\S)\s*)(.*)/,a)
currHead = a[1]
currChar = a[2]
currTail = a[3]
}
currChar == "#" { indent = currHead }
currChar != "#" { indent = (prevChar == "#" ? currHead : indent) }
{ printf "%s%s\n", indent, currTail; prevChar = currChar }
$ awk -f tst.awk file
# jkakjshkjh
* drink (2 spaces * 2 spaces)(non hash starting)
* biscuit (1 space * 2 spaces)(non hash starting)
* paper (* 1 space)(non has starting)
* .. (many more lines) of non hash starting
* tea (7 spaces * 3 space)(non has starting)
# happy
* cup (* 1 space)(non has starting)
* bat (2 spaces * 2 spaces)(non hash starting)
* scooter (1 space * 2 spaces)(non hash starting)
* .. (many more lines) of non hash starting
* disk (7 spaces * 3 space)(non has starting)
С другими awk вы бы просто использовали substr()
s, чтобы получить детали, которые match()
вставляет a[]
для gawk, и используйте [[:space:]]
и [^[:space:]]
для \s
и \S
соответственно.
Чтобы помочь вам понять синтаксис, если бы я писал выше на C-подобном языке, то это было бы:
while ( read(FILENAME,line) ) { # awk does this for you
NR++; # awk does this for you
NF = split(line into $1, $2, $3, ... $NF); # awk does this for you
match(line,/^(\s*(\S)\s*)(.*)/,a);
currHead = a[1];
currChar = a[2];
currTail = a[3];
if (currChar == "#") { indent = currHead; }
if (currChar != "#") { indent = (prevChar == "#" ? currHead : indent); }
printf "%s%s\n", indent, currTail; prevChar = currChar;
} # awk does this for you
и фактически вы можете продублировать этот синтаксис в разделе awks BEGIN с помощью:
BEGIN {
filename = ARGV[1]
ARGV[1] = ""
ARGC--
while ( (getline line < filename) > 0) ) {
nr++
nf = split(line,flds)
match(line,/^(\s*(\S)\s*)(.*)/,a)
currHead = a[1]
currChar = a[2]
currTail = a[3]
if (currChar == "#") { indent = currHead }
if (currChar != "#") { indent = (prevChar == "#" ? currHead : indent) }
printf "%s%s\n", indent, currTail; prevChar = currChar
}
}
но см. http://awk.freeshell.org/AllAboutGetline, почему бы не сделать это, если у вас нет особых потребностей.