Как скопировать и вставить текст между текстом с помощью 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
Когда вы видите строку с литералом, держите шестнадцатеричный номер в области удержания.
Когда вы увидите строку с заливкой, замените шестнадцатеричный номер на номер в области удержания