Android busybox sed:替换表达式中的错误选项

时间:2015-03-02 23:22:26

标签: android regex sed busybox

我需要替换这一行

`<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
        <group gid="sdcard_r" />
        <group gid="sdcard_rw" />
</permission>`

用这个

`<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
        <group gid="sdcard_r" />
        <group gid="sdcard_rw" />
        <group gid="media_rw" />
 </permission>`

换句话说,如果文件group gid="media_rw"中没有包含权限WRITE_EXTERNAL_STORAGE,我需要添加/system/etc/permissions/platform.xml但我收到错误:替换表达式中的错误选项。我正在使用BusyBox v1.22.1和所有小程序

我的代码:

http://pastebin.com/VTURRpDu。我在pastebin上发布了代码,因为我的代码没有正确显示。提前致谢

1 个答案:

答案 0 :(得分:2)

如果你需要漂亮的格式化,你将不得不注入新行和标签(这让我感到痛苦);下面是一个不整洁但以其他方式形成的等价物:

我认为你只需要匹配插入点(倒数第二行或最后一行):

cat infile | sed -e "s/<\/permission>/<group gid=\"media_rw\"\/><\/permission>/"

给出

<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
    <group gid="sdcard_r" />
    <group gid="sdcard_rw" />
<group gid="media_rw"/></permission>

由于我一直在使用sed中的标签和换行符,所以如果你拥有它并且你坚持输出相当好的话,awk会很好地做到这一点。

cat infile | awk '/\/permission/ { print "\t<group gid=\"media_rw\"\/>";}
/./ {print $0;}
'

使用制表符和换行符给出相同的内容:

<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
    <group gid="sdcard_r" />
    <group gid="sdcard_rw" />
    <group gid="media_rw"/>
</permission>

编辑:针对in-file和针对组WRITE_EXTERNAL_STORAGE标记

我会假设此块中键值集的排序并不重要。这将使用开始的权限标签来执行插入,现在使用sed上的 -i 来编辑原始文件。也切换到管道分隔符(避免\ / \ / \ /)。最后,使用&amp;将匹配的文本放入而不是输入 - 假设您的busybox build of sed可以执行此操作。

sed -e "s|<permission name=\"android.permission.WRITE_EXTERNAL_STORAGE\" >$|&<group gid=\"media_rw\"/>|" -i infile

您匹配的标签只需要足够独特。将EOL标记($)添加到匹配部分以仅替换一次。该匹配将无法再次运行,因为该行已更改。