Как скопировать и вставить текст между текстом с помощью SED

Я пытаюсь использовать SLD (Styled Layer Descriptor), чтобы закрасить слой, который будет отображаться на картографическом сервере, однако в моем SLD есть ошибка, поэтому цвета неправильные. Это связано с тем, что SLD использует случайные шестнадцатеричные значения для значения Fill. Правильные значения Hex находятся в 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 из литерала в заливку?

2 ответа

Решение

Я думаю, что это делает то, что вы хотите:

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

Итак, это говорит... "Если вы видите строку ogc:Literal разделить строку, используя > а также < в качестве разделителей и положить элементы в массив a , Сохранить a[3] в переменной с именем hex для последующего использования. Если вы видите строку, содержащую se:SvgParameter name="fill" , замените все, что выглядит как шестнадцатеричное значение в этой строке переменной hex ты вспомнил ранее. 1 в конце значит awk должен выполнить его действие по умолчанию, которое состоит в том, чтобы напечатать строку."

Если вы хотите сохранить измененный файл, используйте:

awk ... YourExistingFile > ModifiedFile

С сед

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

Когда вы видите строку с литералом, держите шестнадцатеричный номер в области удержания.

Когда вы увидите строку с заливкой, замените шестнадцатеричный номер на номер в области удержания

Другие вопросы по тегам