Linux 如何直接用';未扩展';(空格到制表符的转换)?
我试着用一些类似于Linux 如何直接用';未扩展';(空格到制表符的转换)?,linux,unix,redirect,overwrite,Linux,Unix,Redirect,Overwrite,我试着用一些类似于 unexpand -t 4 *.php 但我不确定如何编写此命令来执行我想要的操作 奇怪的是 unexpand -t 4 file.php > file.php 给我一个空文件。(即不使用任何内容覆盖file.php) 我可以指定多个文件,但不知道如何覆盖每个文件 我可以使用我的IDE,但是大约有67000个实例需要替换200多个文件,这需要一段时间 我希望我的问题的答案将是标准的unix费用,但我仍在学习…您很少可以使用输出重定向来替换输入。替换为内部支持它的命令
unexpand -t 4 *.php
但我不确定如何编写此命令来执行我想要的操作
奇怪的是
unexpand -t 4 file.php > file.php
给我一个空文件。(即不使用任何内容覆盖file.php)
我可以指定多个文件,但不知道如何覆盖每个文件
我可以使用我的IDE,但是大约有67000个实例需要替换200多个文件,这需要一段时间
我希望我的问题的答案将是标准的unix费用,但我仍在学习…您很少可以使用输出重定向来替换输入。替换为内部支持它的命令(因为它们自己执行基本步骤)。从shell级别来看,分两步工作要好得多,如下所示:
for a in *.php
do
unexpand -t 4 $a >$a-notab
mv $a-notab $a
done
您可以做得更好(错误检查等),但这是基本轮廓。以下是我使用的命令:
for p in $(find . -iname "*.js")
do
unexpand -t 4 $(dirname $p)/"$(basename $p)" > $(dirname $p)/"$(basename $p)-tab"
mv $(dirname $p)/"$(basename $p)-tab" $(dirname $p)/"$(basename $p)"
done
此版本更改以当前工作目录为根目录的目录层次结构中的所有文件
在我的例子中,我只想对.js
文件进行此更改;如果愿意,可以省略find
中的iname
子句,或者使用不同的参数以不同的方式撒网
我的版本将文件名用引号括起来,但在匹配文件路径中出现的“有趣”目录名周围不使用引号
若要在一行上完成所有操作,请在第1、3和4行之后添加半成品
这有潜在的危险,所以在运行命令之前进行备份或使用git。如果您使用的是git,您可以验证是否只有空格被更改为
git diff-w
出于偏执狂的考虑,我倾向于这样做:unexpand-t4“$a”>“$a”-notab&&mv“$a”-notab”$a(这对于几个额外的字符来说是非常安全的)。还有,这些引语真的是个好主意。谢谢你们,非常有用。有没有一种简单的方法可以使文件匹配递归?使文件匹配递归:尝试以获得一个in$(find.)
。这将使后续命令的逻辑复杂化,因为$a
现在将包括目录分隔符,不能用引号整体包装。您可能必须在循环中使用dirname
和basename
来组合源文件名和目标文件名。但是,通过使用find
,您还可以获得强大的过滤选项。