gpt4 book ai didi

java - 如何使用 Java 正确转义 awk 输入的字符串?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:41:07 26 4
gpt4 key购买 nike

我正在尝试在 Java 中执行以下命令(在终端上运行):

awk -F';' 'NR>1{gsub(/; +/,";",$0);printf("{msisdn:\"%s\",imei:\"%s\",brand:\"%s\",model:\"%s\",sap:\"%s\",sap_cod:\"%s\",file_name:\"teste\",company:{\"$ref\":\"company\",\"$id\":ObjectId\"456\")}}\n",$2,$15,$16,$17,$18,$20)}' /Users/milena/Desktop/giant.csv

我使用的 Java 代码是这样的:

String fileName = "test";
String company = "456";

String awk = "awk -F';' 'NR>1";
String gsub = "{gsub(/; +/,\";\",$0);";

String printf = "printf(\"{msisdn:\\\"%s\\\",imei:\\\"%s\\\",brand:\\\"%s\\\","
+ "model:\\\"%s\\\",sap:\\\"%s\\\",sap_cod:\\\"%s\\\",file_name:\\\""+fileName+"\\\",company:"
+ "{\\\"$ref\\\":\\\"company\\\",\\\"$id\\\":ObjectId\\\""+company+"\\\")}}\\n\",$2,$15,$16,$17,$18,$20)}\' ";

String path = "/Users/milena/Desktop/giant.csv";

String command = awk + gsub + printf + path;

Process p
p = Runtime.getRuntime().exec(command);

我得到的错误是:

awk: syntax error at source line 1
context is
>>> ' <<<
missing }
missing )
awk: bailing out at source line 1

我做错了什么有什么想法吗?

最佳答案

当您使用 Runtime.getRuntime().exec(command) 时,它会获取字符串并将其分解为基于空格的命令和参数。

这种简单的解析与调用命令时由 shell 完成的解析不同。例如,shell 会考虑引号。这意味着如果您有如下命令行:

cmd 'abc' 'def'

shell 将发送到 cmd 命令的参数将是 abcdef。但是,如果您向 Runtime.getRuntime().exec(command) 发出相同的命令,它将发送 'abc''def'cmd 作为参数。是的,包括引号!

如果任何参数中有空格,情况会变得更糟。如果外壳得到

cmd 'my single argument'

它将调用带有单个参数的命令 my single argument。但是 Runtime.getRuntime().exec(command) 将使用三个参数调用 cmd:'mysingle参数'!

因此,除了非常简单的命令外,不建议将此特定重载用于任何其他用途。相反,您应该使用接受字符串数组的重载。第一个元素应该是命令名称,每个参数应该在一个单独的元素中:

String[] command = { "awk",
"-F;",
"NR>1{gsub(/; +/,\";\",$0);printf(\"{msisdn:\\\"%s\\\",...",
"/Users/milena/Desktop/giant.csv"
};
Process p = Runtime.getRuntime().exec(command);

注意:建议使用ProcessBuilder类来构建 Process 而不是 Runtime.getRuntime.exec - 它可以让您更好地控制命令,您可以将单独的参数直接传递给构造函数。

关于java - 如何使用 Java 正确转义 awk 输入的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33391844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com