sed使用简单的正则表达式检查将整行替换为字符串

sed使用简单的正则表达式检查将整行替换为字符串,sed,Sed,我正在使用cordova为android构建应用程序,但无法在AndroidManifest.xml文件中设置android:minSdkVersion 因此,我决定在每次使用我编写的脚本开始构建应用程序时修改此文件 我想换一行: <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="19" /> 但它仍然给我的使用sdk行不变 我的regexp有什么问题?三件事: 您需要通过将(.*)替换为\(.*)来修改组

我正在使用cordova为android构建应用程序,但无法在AndroidManifest.xml文件中设置android:minSdkVersion

因此,我决定在每次使用我编写的脚本开始构建应用程序时修改此文件

我想换一行:

<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="19" />
但它仍然给我的使用sdk行不变

我的regexp有什么问题?

三件事:

  • 您需要通过将
    (.*)
    替换为
    \(.*)
    来修改组
  • 你不需要团队
  • 你配得太多了,试试看

    sed's/minSdkVersion=“[0-9]+”/minSdkVersion=“14”/g'AndroidManifest.xml


  • 如果要修改文件,请使用
    -i
    更改文件。

    正则表达式有两个问题

  • 括号显然被您的
    sed
    方言解释为文字括号。不管怎么说,它们都是无用的,所以你不需要修复它们——只需移除它们

  • *
    是贪婪的,将匹配到上一个双引号之前

  • 有了这些话,修复就很容易了

    sed 's/minSdkVersion="[^"]*"/minSdkVersion="14"/g' AndroidManifest.xml
    

    请注意,
    sed'…'文件
    将输出命令的结果。如果要更新文件,请使用
    sed-i.bak'…'文件
    file
    将包含新内容,而
    file.bak
    将包含一个备份。它与Ubuntu中的gnu sed一起工作,您使用什么?@NovumCoder correct,
    +
    是ERE元字符,sed默认使用BRE。您需要提供一个参数来激活ERE(例如,
    -r
    或显然是
    -e
    ),或者在某些sed中,只需在
    +
    前面加一个反斜杠,就可以告诉sed将其用作ERE元字符,而不是文字加号。
    sed 's/minSdkVersion="(.*)"/minSdkVersion="14"/g' AndroidManifest.xml
    
    sed 's/minSdkVersion="[^"]*"/minSdkVersion="14"/g' AndroidManifest.xml