Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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
Bash 将Perl命令输出重定向到文件_Bash_Perl - Fatal编程技术网

Bash 将Perl命令输出重定向到文件

Bash 将Perl命令输出重定向到文件,bash,perl,Bash,Perl,在bash脚本中,我尝试对每个文件调用以下Perl命令,然后将Perl命令的输出重定向到该文件 Perl命令非常简单。当它打印到控制台时,它似乎可以工作。但是,当我尝试将输出重定向到每个单独的文件时,该文件变为空。我做错了什么 #!/usr/bin/env bash shopt -s globstar for file in ./**/*.java; do perl -0pe 's|//.*?\n|\n|g; s#/\*(.|\n)*?\*/##g; s/\n\n+/\n\n/g' "

在bash脚本中,我尝试对每个文件调用以下Perl命令,然后将Perl命令的输出重定向到该文件

Perl命令非常简单。当它打印到控制台时,它似乎可以工作。但是,当我尝试将输出重定向到每个单独的文件时,该文件变为空。我做错了什么

#!/usr/bin/env bash

shopt -s globstar
for file in ./**/*.java; do
    perl -0pe 's|//.*?\n|\n|g; s#/\*(.|\n)*?\*/##g; s/\n\n+/\n\n/g' "$file" > "$file";
done

您正在尝试从文件中读取,并尝试将输出重新定向到同一文件。这是行不通的。Shell首先打开文件进行写入,现在当Perl尝试从文件中读取时,没有任何内容,因此没有输出

您可以使用Perl的
-i
选项进行就地编辑

perl -i.bak -0pe 's|//.*?\n|\n|g; s#/\*(.|\n)*?\*/##g; s/\n\n+/\n\n/g' "$file"

这将直接编辑文件,并具有扩展名为.bak的文件原始副本。如果您不需要任何备份,只需使用
-i
代替
-i.bak

您正在尝试从文件读取并尝试将输出重新定向到同一文件。这是行不通的。Shell首先打开文件进行写入,现在当Perl尝试从文件中读取时,没有任何内容,因此没有输出

您可以使用Perl的
-i
选项进行就地编辑

perl -i.bak -0pe 's|//.*?\n|\n|g; s#/\*(.|\n)*?\*/##g; s/\n\n+/\n\n/g' "$file"

这将直接编辑文件,并具有扩展名为.bak的文件原始副本。如果您不需要任何备份,只需使用
-i
来代替
-i.bak

提示:
-0
实际上不会清除文件。您应该改用
-0777
。@ikegami当时是如何不逐行处理文件的?请阅读
$/=“\0”之间的差异
-0
)和
$/=undef
-0777
)。第一个用户的意图不是发出声音(也不会总是这样)。提示:
-0
实际上不会发出声音。您应该改用
-0777
。@ikegami当时是如何不逐行处理文件的?请阅读
$/=“\0”之间的差异
-0
)和
$/=undef
-0777
)。这不是第一个人的初衷(也不会总是这样)。谢谢!现在有道理了!非常感谢。现在有道理了!