如何使用 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
我正在尝试使用 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