Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从java代码运行sed命令_Java_Bash - Fatal编程技术网

如何从java代码运行sed命令

如何从java代码运行sed命令,java,bash,Java,Bash,我可能遗漏了一些东西,但我正在尝试从java运行命令行 代码如下: String command = "sed -i 's/\\^@\\^/\\|/g' /tmp/part-00000-00000"; ProcessBuilder pb = new ProcessBuilder(command); pb.redirectErrorStream(true); Process process = pb.start(); process.waitFor(); if (process.exitValue

我可能遗漏了一些东西,但我正在尝试从java运行命令行

代码如下:

String command = "sed -i 's/\\^@\\^/\\|/g' /tmp/part-00000-00000";
ProcessBuilder pb = new ProcessBuilder(command);
pb.redirectErrorStream(true);
Process process = pb.start();
process.waitFor();
if (process.exitValue() > 0) {
    String output = // get output form command
    throw new Exception(output);
}
我得到以下错误:

 java.lang.Exception: Cannot run program "sed  -i 's/\^@\^/\|/g' /tmp/part-00000-00000": error=2, No such file or directory
fils是存在的。我正在对这个文件进行ll,它是存在的。 我只是在寻找一种从java实现的方法。我做错了什么?

试试看

Process p = Runtime.getRuntime().exec("sed -i 's/\\^@\\^/\\|/g' /tmp/part-00000-00000");

将命令作为数组而不是字符串传递:

String[] command={"sed", "-i", "'s/\\^@\\^/\\|/g'", "/tmp/part-00000-00000"};

请参阅文档。

老实说,在这种情况下,不需要外部执行
sed
。用Java读取文件并使用
模式
。然后你就有了可以在任何平台上运行的代码。将其与org.apache.commons.io.FileUtils结合使用,只需几行代码即可完成

    final File = new File("/tmp/part-00000-00000");    
    String contents = FileUtils.readFileToString(file, StandardCharsets.UTF_8.name());
    contents = Pattern.compile("\\^@\\^/\\").matcher(contents).replaceAll("|");
    FileUtils.write(file, contents);
或者,用一个简单、独立、正确的例子

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.regex.Pattern;

    public final class SedUtil {

        public static void main(String... args) throws Exception {
            final File file = new File("part-00000-00000");
            final String data = "trombone ^@^ shorty";
            FileUtils.write(file, data);
            sed(file, Pattern.compile("\\^@\\^"), "|");
            System.out.println(data);
            System.out.println(FileUtils.readFileToString(file, StandardCharsets.UTF_8));
        }

        public static void sed(File file, Pattern regex, String value) throws IOException {
            String contents = FileUtils.readFileToString(file, StandardCharsets.UTF_8.name());
            contents = regex.matcher(contents).replaceAll(value);
            FileUtils.write(file, contents);
        }
    }
它给出了输出

trombone ^@^ shorty
trombone | shorty

这段代码真的很神奇,简单,简短,经过100%测试 示例我想从文件(/sdcard/MT2/file.json)中删除行的最后一个字符

这里的神奇代码不仅运行sed,还运行echo、cat等等
祝你好运

对Java不太熟悉,所以只是一个猜测,但它似乎将整个字符串解释为一个命令的名称,而不是一系列参数。对我来说,这样更好,要在Java中传输XML并在Java中执行搜索和替换,而不是从外部shell执行
sed
,这里的问题非常类似
String[] cmdline = { "sh", "-c", "sed -i 's/.$//' /sdcard/MT2/file.json " }; 
try {
  Runtime.getRuntime().exec(cmdline);
} catch (Exception s) {
  finishAffinity();
}