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

How to copy & paste text between text using SED

我正在尝试使用 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 或类似的方法可以将十六进制值从 Literal 复制并粘贴到 Fill?

我认为这符合您的要求:

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

所以,也就是说... "If you see the string ogc:Literal, split the line using > and < as separators and put the elements into array a. Save a[3] in a variable called hex for later use. If you see a line containing se:SvgParameter name="fill", substitute anything that looks like a hex value in that line with the variable hex you remembered earlier. The 1 at the end means awk should do its default action, which is to print the line."

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

awk ... YourExistingFile > ModifiedFile

使用 sed

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

当您看到带有 Literal 的行时,保留 hexnumber space。

当您看到有填充的行时,将 hexnumber 与 hold 中的 hexnumber 交换 space