0

我想更改的文件不止一行。这是一个 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/'和类似的,但我错过了一些东西。

4

2 回答 2

1

您显示的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"

这个问题显示了“扁平化”问题是如何产生的。有两个级别的shell解释(运行su命令的shell,以及由su命令运行的shell),这足以让任何人头疼。将反斜杠加倍可能就足够了,但我会创建一个脚本并运行它。

于 2011-12-10T05:10:53.503 回答
1

这可能对您有用:

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

注意最后一种方法仅适用于单个替换,除非要替换的每个段落(按顺序)都在 new_para.txt 文件中。这确实让用户有机会定制每个替换段落,这是一个微妙但强大的差异。

编辑:

要在没有中间文件的情况下获得相同的结果:

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
于 2011-12-10T08:07:06.503 回答