2016-08-14 4 views
0

У меня есть следующий файл:обработка текста (перенос строки) в сценарии оболочки

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) 

Я хочу, чтобы переписать этот файл таким образом, что все ведущие пробелы удаляются, а также я хочу, чтобы заставить после некоторого столбца (скажем, столбец 80), чтобы разбить линию. До сих пор первая проблема решается с помощью

sed -e 's/^[ \t]*//' file1.m > file2.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) 

ответ

4

Вы можете использовать комбинацию tr и 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) 
+0

Можно ли начинать каждую линию с +/-? –

1

Вы можете сделать свои собственные правила складывания с помощью sed. Вот как вы можете сделать + или - как первый символ вашей линии.

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

EDIT: Без форматирования обратный слэш исчез. Я также удалил нижний уровень 70 в \{70,80\}. Результат:

(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) 
+0

Это решение было бы замечательно, но с примером, который вы предоставили, его не работает. Ошибка: sed: 1: "s/((.) {70,80}) ([+ -])/\ ...": \ 1 не определено в RE –

+0

Исправлено. Я также добавил результат. –

+0

Большое спасибо. Он отлично работает в Linux. Две второстепенные проблемы: 1. Он излишне отключает последнюю строку, т. Е. Часть + z)^4) все еще остается в столбце 80 в предыдущей строке. 2. Он не будет работать на Mac, возможно, потому что mac sed отличается от unix sed. Во всяком случае, это все еще замечательно. –

Смежные вопросы