Android busybox sed:替换表达式中的错误选项
Android busybox sed: bad option in substitution expression
我需要替换这行
`<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>`
换句话说,我需要在权限 WRITE_EXTERNAL_STORAGE 中添加 group gid="media_rw"
如果它不包含在文件 /system/etc/permissions/platform.xml
中,但我得到错误:替换表达式中的错误选项。我在所有小程序中使用 BusyBox v1.22.1
我的代码:
http://pastebin.com/VTURRpDu 。我在 pastebin 上发布了代码,因为我的代码在这里显示不正确。提前致谢
如果你需要漂亮的格式,你将不得不插入换行符和制表符(这让我在 sed 中很痛苦);一个不整洁但以其他方式形成的等价物:
我认为你只需要匹配插入点(倒数第二行或最后一行)因此:
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 [=12=];}
'
给出相同的选项卡和换行符:
<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
<group gid="sdcard_r" />
<group gid="sdcard_rw" />
<group gid="media_rw"/>
</permission>
编辑:针对文件内和群组 WRITE_EXTERNAL_STORAGE 标签
我假设此块中键值集的顺序并不重要。这将改为使用开始的 permission 标记来执行插入,现在在 sed 上使用 -i 来编辑原始文件。还切换到管道分隔符(避免 \/\/\/)。最后,使用 & 放置匹配的文本而不是将其键入——假设您的 busybox 版本的 sed 可以做到这一点。
sed -e "s|<permission name=\"android.permission.WRITE_EXTERNAL_STORAGE\" >$|&<group gid=\"media_rw\"/>|" -i infile
您匹配的标签只需足够独特即可。将 EOL 标记 ($) 添加到匹配部分以仅替换一次。第二次匹配将无法进行,因为行已更改。
我需要替换这行
`<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>`
换句话说,我需要在权限 WRITE_EXTERNAL_STORAGE 中添加 group gid="media_rw"
如果它不包含在文件 /system/etc/permissions/platform.xml
中,但我得到错误:替换表达式中的错误选项。我在所有小程序中使用 BusyBox v1.22.1
我的代码:
http://pastebin.com/VTURRpDu 。我在 pastebin 上发布了代码,因为我的代码在这里显示不正确。提前致谢
如果你需要漂亮的格式,你将不得不插入换行符和制表符(这让我在 sed 中很痛苦);一个不整洁但以其他方式形成的等价物:
我认为你只需要匹配插入点(倒数第二行或最后一行)因此:
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 [=12=];}
'
给出相同的选项卡和换行符:
<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
<group gid="sdcard_r" />
<group gid="sdcard_rw" />
<group gid="media_rw"/>
</permission>
编辑:针对文件内和群组 WRITE_EXTERNAL_STORAGE 标签
我假设此块中键值集的顺序并不重要。这将改为使用开始的 permission 标记来执行插入,现在在 sed 上使用 -i 来编辑原始文件。还切换到管道分隔符(避免 \/\/\/)。最后,使用 & 放置匹配的文本而不是将其键入——假设您的 busybox 版本的 sed 可以做到这一点。
sed -e "s|<permission name=\"android.permission.WRITE_EXTERNAL_STORAGE\" >$|&<group gid=\"media_rw\"/>|" -i infile
您匹配的标签只需足够独特即可。将 EOL 标记 ($) 添加到匹配部分以仅替换一次。第二次匹配将无法进行,因为行已更改。