Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I have bash "eat" indentation characters common to all lines in a string?

I have some multi-line string in a shell variable. All lines of the string have an unknown indentation level of at least a few white-space characters (8 spaces in my example, but can be arbitrary). Let's look at this example string for instance:

        I am at the root indentation level (8 spaces).
        I am at the root indentation level, too.
            I am one level deeper
            Am too
        I am at the root again
                I am even two levels deeper
                    three
                two
            one
        common
        common

What I want is a Bash function or command to strip away the common level of indentation (8 spaces here) so I get this:

I am at the root indentation level (8 spaces).
I am at the root indentation level, too.
    I am one level deeper
    Am too
I am at the root again
        I am even two levels deeper
            three
        two
    one
common
common

It can be assumed that the first line of this string is always at this common indentation level. What is the easiest way to do this? Ideally it should work, when reading the string line by line.

like image 363
con-f-use Avatar asked Dec 29 '25 05:12

con-f-use


1 Answers

You can use awk:

awk 'NR==1 && match($0, /^ +/){n=RLENGTH} {sub("^ {"n"}", "")} 1' file
I am at the root indentation level (8 spaces).
I am at the root indentation level, too.
    I am one level deeper
    Am too
I am at the root again
        I am even two levels deeper
            three
        two
    one
common
common

For the 1st record (NR==1) we match spaces at start (match($0, /^ +/)) and store the length of the match (RLENGTH) into a variable n.

Then while printing we strip n spaces in gsub("^ {"n"}", "").

like image 162
anubhava Avatar answered Dec 30 '25 19:12

anubhava



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!