如何在bash脚本中用多行/流替换单个流/行?



我是新手,所以请原谅我。:(在android的bash脚本中,我试图用另一组存储在另一个xml文件中的流/行替换单一的fonts.xml流,行是:


<family name="sans-serif">

和我试图取代它的是:(这是存储在另一个xml文件)


<family name="sans-serif">
<font weight="100" style="normal">Thin.ttf</font>
<font weight="100" style="italic">ThinItalic.ttf</font>
<font weight="300" style="normal">Light.ttf</font>
<font weight="300" style="italic">LightItalic.ttf</font>
<font weight="400" style="normal">Regular.ttf</font>
<font weight="400" style="italic">Italic.ttf</font>
<font weight="500" style="normal">Medium.ttf</font>
<font weight="500" style="italic">MediumItalic.ttf</font>
<font weight="700" style="normal">Bold.ttf</font>
<font weight="700" style="italic">BoldItalic.ttf</font>
<font weight="900" style="normal">Black.ttf</font>
<font weight="900" style="italic">BlackItalic.ttf</font>
</family>
<family>

的目标是使用自定义字体作为第一字体默认通过magisk模块和Roboto作为后备。如何使用sed将第一个流替换为预期的流集。我尝试了几种基本的方法,但似乎都不起作用!

如果您确实想要使用sed来完成此操作,您可以尝试以下实现:用新行(n)替换未使用的字符(%),执行替换,然后恢复新行。

#!/bin/bash
multi_line_sed()
{
local find_str="$1"
local replace_str="$2"
local unused_char="%"
# 1. substitute out new lines (for stdin and function arguments)
# 2. perform replacement
# 3. restore new lines
find_str=$(printf "$find_str" | tr "n" "$unused_char")
replace_str=$(printf "$replace_str" | tr "n" "$unused_char")
tr "n" "$unused_char" |
sed "s|${find_str}|${replace_str}|g" |
tr "$unused_char" "n"
}
file="fonts.xml"
find_str="<family name="sans-serif">"
replace_str="$(cat custom_font.xml)"
cat "$file" | multi_line_sed "$find_str" "$replace_str"

相关内容

  • 没有找到相关文章

最新更新