0

I have the following file:

cat file1.m

(4 (5 y^7 (-1 + 4 z) + y^6 (15 - 83 z + 80 z^2) -
    5 z^4 (-2 + 4 z - 3 z^2 + z^3) + y^5 (-20 + 147 z - 273 z^2 + 140 z^3) +
    y z^3 (40 - 154 z + 147 z^2 - 83 z^3 + 20 z^4) +
    y^2 z^2 (60 - 254 z + 363 z^2 - 273 z^3 + 80 z^4) +
    y^3 z (40 - 254 z + 462 z^2 - 439 z^3 + 140 z^4) +
    y^4 (10 - 154 z + 363 z^2 - 439 z^3 + 160 z^4)) -
9 (y + z)^4 (2 + y^2 (3 - 9 z) - 4 z + 3 z^2 - z^3 + y^3 (-1 + 4 z) +
    y (-4 + 12 z - 9 z^2 + 4 z^3)) H(0, y) -
9 (y + z)^4 (2 + y^2 (3 - 9 z) - 4 z + 3 z^2 - z^3 + y^3 (-1 + 4 z) +
    y (-4 + 12 z - 9 z^2 + 4 z^3)) H(0, z) +
36 y z (-5 y^3 + 3 y^4 + y z^2 + y^2 (6 + z - 6 z^2) +
    z^2 (6 - 5 z + 3 z^2)) H(1, z) +
36 y z (-5 y^3 + 3 y^4 + y z^2 + y^2 (6 + z - 6 z^2) +
    z^2 (6 - 5 z + 3 z^2)) H(2, y))/(216 y z (-1 + y + z) (y + z)^4)

I want to rewrite this file so that all the leading spaces are removed and also I want to force after some column (say column 80) to break the line. So far the first problem is solved using

sed -e 's/^[ \t]*//' file1.m > file2.m

But how to break the line after some column? The desired output is

(4 (5 y^7 (-1 + 4 z) + y^6 (15 - 83 z + 80 z^2) - 5 z^4 (-2 + 4 z - 3 z^2 + z^3)
+ y^5 (-20 + 147 z - 273 z^2 + 140 z^3) + y z^3 (40 - 154 z + 147 z^2 - 83 z^3
+ 20 z^4) + y^2 z^2 (60 - 254 z + 363 z^2 - 273 z^3 + 80 z^4) + y^3 z (40
- 254 z + 462 z^2 - 439 z^3 + 140 z^4) + y^4 (10 - 154 z + 363 z^2 - 439 z^3
+ 160 z^4)) - 9 (y + z)^4 (2 + y^2 (3 - 9 z) - 4 z + 3 z^2 - z^3 + y^3 (-1
+ 4 z) + y (-4 + 12 z - 9 z^2 + 4 z^3)) H(0, y) - 9 (y + z)^4 (2 + y^2 (3 - 9 z)
- 4 z + 3 z^2 - z^3 + y^3 (-1 + 4 z) + y (-4 + 12 z - 9 z^2 + 4 z^3)) H(0, z)
+ 36 y z (-5 y^3 + 3 y^4 + y z^2 + y^2 (6 + z - 6 z^2) + z^2 (6 - 5 z + 3 z^2))
H(1, z) + 36 y z (-5 y^3 + 3 y^4 + y z^2 + y^2 (6 + z - 6 z^2) + z^2 (6 - 5 z
+ 3 z^2)) H(2, y))/(216 y z (-1 + y + z) (y + z)^4)

2 Answers 2

4

You can use a combination of tr and fold:

$ sed 's/^[ \t]*//' a.m | tr -d '\n' | fold -w80
(4 (5 y^7 (-1 + 4 z) + y^6 (15 - 83 z + 80 z^2) -5 z^4 (-2 + 4 z - 3 z^2 + z^3) 
+ y^5 (-20 + 147 z - 273 z^2 + 140 z^3) +y z^3 (40 - 154 z + 147 z^2 - 83 z^3 + 
20 z^4) +y^2 z^2 (60 - 254 z + 363 z^2 - 273 z^3 + 80 z^4) +y^3 z (40 - 254 z + 
462 z^2 - 439 z^3 + 140 z^4) +y^4 (10 - 154 z + 363 z^2 - 439 z^3 + 160 z^4)) -9
 (y + z)^4 (2 + y^2 (3 - 9 z) - 4 z + 3 z^2 - z^3 + y^3 (-1 + 4 z) +y (-4 + 12 z
 - 9 z^2 + 4 z^3)) H(0, y) -9 (y + z)^4 (2 + y^2 (3 - 9 z) - 4 z + 3 z^2 - z^3 +
 y^3 (-1 + 4 z) +y (-4 + 12 z - 9 z^2 + 4 z^3)) H(0, z) +36 y z (-5 y^3 + 3 y^4 
+ y z^2 + y^2 (6 + z - 6 z^2) +z^2 (6 - 5 z + 3 z^2)) H(1, z) +36 y z (-5 y^3 + 
3 y^4 + y z^2 + y^2 (6 + z - 6 z^2) +z^2 (6 - 5 z + 3 z^2)) H(2, y))/(216 y z (-
1 + y + z) (y + z)^4)
Sign up to request clarification or add additional context in comments.

1 Comment

Is it possible to start each line with a +/-?
1

You can make your own folding rules using sed. Here is how you can make a + or - as the first character of your line.

sed -e 's/^[ \t]*//' file1.m | 
   tr -d '\n' | 
   sed 's/\(\(.\)\{,80\}\) \([\+\-]\)/\1\n\3/g'

EDIT: Without formatting the backslashes disappeared. I also removed the lowerbound of 70 in \{70,80\}. Result:

(4 (5 y^7 (-1 + 4 z) + y^6 (15 - 83 z + 80 z^2) - 5 z^4 (-2 + 4 z - 3 z^2
+ z^3)+ y^5 (-20 + 147 z - 273 z^2 + 140 z^3) + y z^3 (40 - 154 z + 147 z^2
- 83 z^3+ 20 z^4) + y^2 z^2 (60 - 254 z + 363 z^2 - 273 z^3 + 80 z^4)
+ y^3 z (40- 254 z + 462 z^2 - 439 z^3 + 140 z^4) + y^4 (10 - 154 z + 363 z^2
- 439 z^3+ 160 z^4)) - 9 (y + z)^4 (2 + y^2 (3 - 9 z) - 4 z + 3 z^2 - z^3
+ y^3 (-1+ 4 z) + y (-4 + 12 z - 9 z^2 + 4 z^3)) H(0, y) - 9 (y + z)^4 (2
+ y^2 (3 - 9 z)- 4 z + 3 z^2 - z^3 + y^3 (-1 + 4 z) + y (-4 + 12 z - 9 z^2
+ 4 z^3)) H(0, z)+ 36 y z (-5 y^3 + 3 y^4 + y z^2 + y^2 (6 + z - 6 z^2) + z^2 (6
- 5 z + 3 z^2))H(1, z) + 36 y z (-5 y^3 + 3 y^4 + y z^2 + y^2 (6 + z - 6 z^2)
+ z^2 (6 - 5 z+ 3 z^2)) H(2, y))/(216 y z (-1 + y + z) (y
+ z)^4)

3 Comments

This solution would be great, but with the example that you have provided, its not working. Error: sed: 1: "s/((.){70,80}) ([+-])/\ ...": \1 not defined in the RE
Fixed. I also added the result.
Thanks a lot. It works perfectly in linux. Two minor issues : 1. It breaks the last line unnecessarily i.e. the + z)^4) part still remains within column 80 in the previous line. 2. It wont work on mac, probably because mac sed is different than unix sed. Anyway this is still great.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.