Bash 将Perl命令输出重定向到文件
在bash脚本中,我尝试对每个文件调用以下Perl命令,然后将Perl命令的输出重定向到该文件 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' "
#!/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
)。这不是第一个人的初衷(也不会总是这样)。谢谢!现在有道理了!非常感谢。现在有道理了!