Как заменить абзац в файле? - PullRequest
0 голосов
/ 10 декабря 2011

Я хочу изменить больше, чем строку файла.Это файл CSS, и я хочу поменять раздел на другой.

Это фрагмент из файла:

    /*** Debugging ***/
    draw-button-bounding-rects: false;
    draw-button-rects: false;
    debug-touch-points: false;
    draw-reactive-areas: false;
}

MImAbstractKeyAreaStyle.Landscape {
    /*** Label Setttings ***/
    label-margin-top: 0.6mm;
    label-margin-left-with-secondary: -1; /* not used, labels are centered horizontally */
    secondary-label-separation: 0;

    /*** Behaviour ***/
    touchpoint-horizontal-gravity: 32px;
    touchpoint-vertical-gravity: 20px;

    /*** Key Geometry ***/
    key-height-small: -1; /* unused */
    key-height-medium: 46px;
    key-height-large: 66px;
    key-height-x-large: 82px;
    key-height-xx-large: -1; /* unused */

    key-width-small-fixed: -1; /* unused */
    key-width-medium-fixed: 76px;
    key-width-large-fixed: 93px;
    key-width-x-large-fixed: 178px;
    key-width-xx-large-fixed: 244px;
    key-width-stretched-fixed: -1; /* unused */

    key-margin-left: 4px;
    key-margin-top: 0px;
    key-margin-right: 4px;
    key-margin-bottom: 12px;

    padding-left: 11px;
    padding-top: 8px;
    padding-right: 11px;
    padding-bottom: 8px;

    /*** Key Area Geometry ***/
    size: 854 -1;
}

MImAbstractKeyAreaStyle.Portrait {

Если я использую sed -n '/aStyle.Landscape {/,/}/p', он печатает правильный абзацно я хочу заменить это другим.Я пробовал с sed '/aStyle.Landscape {/}/s/aStyle.Landscape {/something/' и подобным, но мне чего-то не хватает.

Ответы [ 2 ]

1 голос
/ 10 декабря 2011

Это может помочь вам:

cat <<\EOF > new_para.txt
MImAbstractKeyAreaStyle.Landscape
    /*** Label Setttings ***
    label-margin-top: 6.0mm;
    label-margin-left-with-secondary: +1;
    secondary-label-separation: 2;
    ...
}
EOF
> MImAbstractKeyAreaStyle.Landscape
>     /*** Label Setttings ***
>     label-margin-top: 6.0mm;
>     label-margin-left-with-secondary: +1;
>     secondary-label-separation: 2;
>     ...
> }
sed -i -e '/aStyle.Landscape {/,/}/{/}/r new_para.txt' -e ';d}' file.css

Если замещающий абзац такой же длины и вы используете GNU sed, это сработает так:

sed -i -e '/aStyle.Landscape {/,/}/{R new_para.txt' -e ';d}' file.css

N.B. Последний метод работает только для одной замены, если каждый заменяемый абзац (по порядку) не находится в файле new_para.txt. Это дает пользователю возможность адаптировать каждый абзац замены, небольшая, но существенная разница.

EDIT:

Для достижения того же результата без промежуточного файла:

cat <<\EOF | sed -i -e '/aStyle.Landscape {/,/}/{/}/r /dev/stdin ' -e ';d}' file.css
MImAbstractKeyAreaStyle.Landscape
    /*** Label Setttings ***
    label-margin-top: 6.0mm;
    label-margin-left-with-secondary: +1;
    secondary-label-separation: 2;
    ...
}
EOF
1 голос
/ 10 декабря 2011

Синтаксис sed, который вы показываете, не совсем точен; если это сработало, значит, вы использовали:

sed -n '/aStyle.Landscape {/,/}/p'

чтобы вывести строки из 'aStyle.Landscape' в закрывающую фигурную скобку.

Если вы хотите заменить этот абзац, вы можете сделать:

sed '/aStyle.Landscape {/,/}/c\
MImAbstractKeyAreaStyle.Landscape {\
    /*** Label Setttings ***/\
    label-margin-top: 6.0mm;\
    label-margin-left-with-secondary: +1;\
    secondary-label-separation: 2;\
    ...\
}'

Обратите внимание, что за каждой строкой в ​​тексте замены, кроме последней, следует обратный слеш.

Возможно, вам будет лучше использовать файл сценария:

sed -f sed.script css.file

Когда я запустил приведенный выше скрипт, дословно скопировал этот ответ в файл 'xx' на фрагменте CSS из вопроса (в 'xx.css'), используя sh xx < xx.css, я получил вывод:

    /*** Debugging ***/
    draw-button-bounding-rects: false;
    draw-button-rects: false;
    debug-touch-points: false;
    draw-reactive-areas: false;
}

MImAbstractKeyAreaStyle.Landscape {
    /*** Label Setttings ***/
    label-margin-top: 6.0mm;
    label-margin-left-with-secondary: +1;
    secondary-label-separation: 2;
    ...
}

MImAbstractKeyAreaStyle.Portrait {

Вы сказали, что все в одной строке ... Интересно, как вы запустили сценарий? Если бы все было «в одну строку», мне интересно, если вы делаете что-то вроде:

output=$(sed ... file.css)

с последующим:

echo $output

Это сведет все к одной строке (думайте об этом как о минимизации). Форма CSS будет сохранена, если вы вместо этого напишите:

echo "$output"

Этот вопрос показывает, как возникла проблема сглаживания. Было два уровня интерпретации оболочки (оболочка, которая запускает команду su, и оболочка, запускаемая командой su), которых достаточно, чтобы причинить кому-либо головную боль. Удвоения обратной косой черты может быть достаточно, но я бы создал скрипт и запустил его.

...