OSX系统使用sed匹配模式后追加文本报bad flag错误如何解决
问题原因
- 单引号包裹的sed表达式无法展开变量:你写的
'/$n/ a\'用了单引号,$n会被sed当做字面量处理,不会替换成你实际匹配到的内容。 - 正则分隔符冲突:你的变量
n内容里包含/字符,和sed默认的正则分隔符/重合,sed会把内容里的/解析为正则的结束标记,导致后续内容被错误解析,触发bad flag报错。 - 特殊字符未转义:
n中的括号在sed默认基础正则中属于特殊字符,未转义的情况下也会导致匹配异常。
解决方案
方法1:调整sed参数适配(适配macOS自带sed)
替换正则分隔符为#(变量中不存在的字符即可),改用双引号包裹sed表达式实现变量展开:
n="$(grep ".method" "$m" | grep "onCreate(Landroid/os/Bundle;)V")" # macOS 版本sed sed -i '' -e "\#$n# a\\ \"test\", /Users/username/Documents/afile.xyz " afile.xyz # 如果是Linux版本sed,去掉-i后面的空字符串即可 # sed -i -e "\#$n# a\"test\", /Users/username/Documents/afile.xyz" afile.xyz
方法2:用awk实现更稳定(全平台兼容,无分隔符冲突问题)
awk对变量的处理不需要考虑正则分隔符冲突,适配性更强,不需要处理复杂的转义逻辑:
n="$(grep ".method" "$m" | grep "onCreate(Landroid/os/Bundle;)V")" awk -v target="$n" ' $0 == target { print $0 print "\"test\", /Users/username/Documents/afile.xyz" next } 1' afile.xyz > tmpfile && mv tmpfile afile.xyz
如果需要模糊匹配而非完全匹配,把$0 == target替换为$0 ~ target即可。
内容的提问来源于stack exchange,提问作者Mtoklitz113
相关产品推荐
相关产品推荐

