【问题标题】:groovy sed error sed: -e expression #1, char 1: unknown command: `''groovy sed 错误 sed:-e 表达式 #1,字符 1:未知命令:`''
【发布时间】:2018-01-04 18:00:20
【问题描述】:

Groovy 代码是:

def cmd = "sed -i \'1 i <?xml version=\"1.1\"?>\' test.xml"
println cmd
println cmd.execute().err.text

输出:

sed -i '1 i <?xml version="1.1"?>' test.xml
sed: -e expression #1, char 1: unknown command: `''

这是在 cli 中运行良好的实际命令 sed -i '1 i &lt;?xml version="1.1"?&gt;' test.xml。但是 Groovy execute() 不能正常工作。如何解决这个问题?

更新 1:

也尝试使用下面的cmd,但仍然显示相同的错误。

def cmd = /sed -i '1 i <?xml version="1.1"?>' test.xml/
def cmd = "sed -i '1 i <?xml version=\"1.1\"?>' test.xml"

更新说明:

要检查和更新 xml 文件,

def insertversion(String filename)
{
    def lines= new File (filename).readLines()
    if(!(lines.get(0)).contains('xml version'))
    {
        def cmd = ['sed', '-i', '1 i <?xml version="1.1"?>', filename]
        cmd.execute()
    }
}

【问题讨论】:

    标签: groovy sed


    【解决方案1】:

    在这种情况下,将 shell 命令作为 cmd 和参数列表执行,而不是作为字符串执行命令:

    def cmd = ['sed', '-i', '1 i <?xml version="1.1"?>', 'test.xml']
    println cmd
    println cmd.execute().err.text
    

    在运行像这部分 &lt;?xml version="1.1"&gt; 这样的脚本后,test.xml 文件中被复制(与从命令行运行给定命令的行为相同)。

    List.execute()String.execute() 有什么区别?

    如果您以字符串形式执行 shell 命令,java.lang.Runtime.exec() 方法将使用java.util.StringTokenizer 将您的输入字符串拆分为一个数组。在您的情况下,tokenizer 将创建 7 个令牌,您可以通过运行以下脚本来检查它:

    def cmd = "sed -i \'1 i <?xml version=\"1.1\"?>\' test.xml"
    
    def tokenizer = new StringTokenizer(cmd)
    def tokens = []
    while (tokenizer.hasMoreTokens()) {
        tokens << tokenizer.nextToken()
    }
    
    tokens.each { println it }
    

    它输出:

    sed
    -i
    '1
    i
    <?xml
    version="1.1"?>'
    test.xml
    

    您还可以通过在第 96 行的java.lang.Runtime 类中设置检查点运行调试器来验证它:

    这当然是不正确的。当使用列表执行 shell 命令时,我们将得到正确的命令行参数数组:

    一般的经验法则是,如果您的 shell 命令包含可能混淆java.util.StringTokenizer 的字符,最好使用列表来定义正确的命令行参数列表。

    【讨论】:

    • @Uchiha_Itachi 在脚本中添加了两种情况下发生的情况的说明。希望它有所帮助:)
    • 学到了。。谢谢你的解释 :) 真的很有帮助。
    • 我的经验法则是:永远不要使用字符串版本
    猜你喜欢
    • 2013-07-07
    • 2021-06-26
    • 2015-04-27
    • 2022-12-28
    • 2013-03-08
    • 2019-03-17
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    相关资源
    最近更新 更多