如何复制&使用SED在文本之间粘贴文本

时间:2017-11-05 05:01:02

标签: text sed sld

我正在尝试使用SLD (Styled Layer Descriptor)为将在地图服务器上显示的图层着色,但是我的SLD中存在错误,因此颜色错误。这是因为SLD使用填充值的随机十六进制值。正确的十六进制值在SLD中,但它们不在正确的位置(它们用作图层名称)。

这是SLD的一个片段,它为一个特征着色(还有大约850个其他特征)。

<se:Name>#27D1D1</se:Name>
      <se:Description>
        <se:Title>#27D1D1</se:Title>
      </se:Description>
      <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
        <ogc:PropertyIsEqualTo>
          <ogc:PropertyName>HEXCOLOR</ogc:PropertyName>
          <ogc:Literal>#27D1D1</ogc:Literal> <--I want this Hex value
        </ogc:PropertyIsEqualTo>
      </ogc:Filter>
      <se:PolygonSymbolizer>
        <se:Fill>
          <se:SvgParameter name="fill">#cd42a3</se:SvgParameter>  <--- Put here
        </se:Fill>
        <se:Stroke>
          <se:SvgParameter name="stroke">#000001</se:SvgParameter>
          <se:SvgParameter name="stroke-width">1</se:SvgParameter>
          <se:SvgParameter name="stroke-linejoin">bevel</se:SvgParameter>
        </se:Stroke>
      </se:PolygonSymbolizer>
    </se:Rule>
    <se:Rule>

SED或类似方法是否可以将Hex值从Literal复制并粘贴到Fill?

2 个答案:

答案 0 :(得分:1)

我认为这可以满足您的需求:

awk '/ogc:Literal/{split($0,a,/[><]/);hex=a[3]} /se:SvgParameter name="fill"/{sub(/#[0-9a-fA-F]*/,hex)} 1' YourFile

所以,那说...... &#34;如果你看到字符串ogc:Literal,请使用><作为分隔符拆分行,并将元素放入数组a。将a[3]保存在名为hex的变量中以供日后使用。如果您看到包含se:SvgParameter name="fill"的行,请使用您之前记得的变量hex替换该行中十六进制值的任何内容。最后1表示awk应执行默认操作,即打印该行。&#34;

如果要保存修改后的文件,请使用:

awk ... YourExistingFile > ModifiedFile

答案 1 :(得分:1)

使用sed

sed -E '/Literal/{h;s/([^#]*)(#[^<]*)(.*)/\2/;x};/fill/G;s/([^#]*)(#[^<]*)([^\n]*)\n(.*)/\1\4\3/' SLDfile

当您看到包含Literal的行时,请将十六进制数保留在保留空间中。

当您看到带有填充的行时,请将六角编号与保留空间中的六角编号进行交换