如何将制表符转换为一个目录的每个文件中的空格(可能递归)?
此外,是否有一种方法来设置每个制表符的空格数?
如何将制表符转换为一个目录的每个文件中的空格(可能递归)?
此外,是否有一种方法来设置每个制表符的空格数?
当前回答
Git存储库友好方法
git-tab-to-space() (
d="$(mktemp -d)"
git grep --cached -Il '' | grep -E "${1:-.}" | \
xargs -I'{}' bash -c '\
f="${1}/f" \
&& expand -t 4 "$0" > "$f" && \
chmod --reference="$0" "$f" && \
mv "$f" "$0"' \
'{}' "$d" \
;
rmdir "$d"
)
操作当前目录下的所有文件:
git-tab-to-space
仅作用于C或c++文件:
git-tab-to-space '\.(c|h)(|pp)$'
您可能特别需要这个,因为那些讨厌的makefile需要选项卡。
命令git grep——cached -Il ":
只列出被跟踪的文件,所以.git中没有任何内容 不包括目录、二进制文件(将被损坏)和符号链接(将被转换为常规文件)
如在解释:如何列出所有文本(非二进制)文件在一个git仓库?
chmod——reference保持文件权限不变:https://unix.stackexchange.com/questions/20645/clone-ownership-and-permissions-from-another-file不幸的是,我找不到一个简洁的POSIX替代方案。
如果你的代码库有一个疯狂的想法,允许在字符串中使用功能原始制表符,使用:
expand -i
然后一个接一个地浏览所有非行开头的制表符,你可以列出:是否可能为制表符git grep ?
在Ubuntu 18.04上测试。
其他回答
我的建议是使用:
find . -name '*.lua' -exec ex '+%s/\t/ /g' -cwq {} \;
评论:
Use in place editing. Keep backups in a VCS. No need to produce *.orig files. It's good practice to diff the result against your last commit to make sure this worked as expected, in any case. sed is a stream editor. Use ex for in place editing. This avoids creating extra temp files and spawning shells for each replacement as in the top answer. WARNING: This messes with all tabs, not only those used for indentation. Also it does not do context aware replacement of tabs. This was sufficient for my use case. But might not be acceptable for you. EDIT: An earlier version of this answer used find|xargs instead of find -exec. As pointed out by @gniourf-gniourf this leads to problems with spaces, quotes and control chars in file names cf. Wheeler.
对于递归应用程序,我喜欢上面的“find”示例。为了使其具有非递归性,只更改当前目录中匹配通配符的文件,shell glob扩展可以满足少量文件的需求:
ls *.java | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}' | sh -v
如果在您相信它工作之后希望它保持沉默,只需在sh命令的末尾加上-v。
当然,您可以在第一个命令中选择任何一组文件。例如,以受控的方式只列出一个特定的子目录(或多个目录),如下所示:
ls mod/*/*.php | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}' | sh
或者反过来运行find(1)与深度参数等的一些组合:
find mod/ -name '*.php' -mindepth 1 -maxdepth 2 | awk '{print "expand -t 4 ", $0, " > /tmp/e; mv /tmp/e ", $0}' | sh
警告:这会破坏你的回购。 这将破坏二进制文件,包括那些在svn, .git!使用前请阅读评论!
找到。-iname '*.java' -type f -exec sed -i。/\t/ /g' {} +
原始文件保存为[filename]. trans。
将'*.java'替换为您正在寻找的文件类型的文件结尾。这样可以防止二进制文件的意外损坏。
缺点:
将替换文件中的所有制表符。 如果在这个目录中有一个5GB的SQL转储,将花费很长时间。
在其他答案中建议的使用expand似乎是仅用于此任务的最合乎逻辑的方法。
也就是说,它也可以用Bash和Awk来完成,以防你想在它的同时做一些其他的修改。
如果使用Bash 4.0或更高版本,shopt内置的globstar可以使用**进行递归搜索。
在GNU Awk 4.1或更高版本中,sed可以像“inplace”一样修改文件:
shopt -s globstar
gawk -i inplace '{gsub("\t"," ")}1' **/*.ext
如果你想设置每个制表符的空格数:
gawk -i inplace -v n=4 'BEGIN{for(i=1;i<=n;i++) c=c" "}{gsub("\t",c)}1' **/*.ext
Git存储库友好方法
git-tab-to-space() (
d="$(mktemp -d)"
git grep --cached -Il '' | grep -E "${1:-.}" | \
xargs -I'{}' bash -c '\
f="${1}/f" \
&& expand -t 4 "$0" > "$f" && \
chmod --reference="$0" "$f" && \
mv "$f" "$0"' \
'{}' "$d" \
;
rmdir "$d"
)
操作当前目录下的所有文件:
git-tab-to-space
仅作用于C或c++文件:
git-tab-to-space '\.(c|h)(|pp)$'
您可能特别需要这个,因为那些讨厌的makefile需要选项卡。
命令git grep——cached -Il ":
只列出被跟踪的文件,所以.git中没有任何内容 不包括目录、二进制文件(将被损坏)和符号链接(将被转换为常规文件)
如在解释:如何列出所有文本(非二进制)文件在一个git仓库?
chmod——reference保持文件权限不变:https://unix.stackexchange.com/questions/20645/clone-ownership-and-permissions-from-another-file不幸的是,我找不到一个简洁的POSIX替代方案。
如果你的代码库有一个疯狂的想法,允许在字符串中使用功能原始制表符,使用:
expand -i
然后一个接一个地浏览所有非行开头的制表符,你可以列出:是否可能为制表符git grep ?
在Ubuntu 18.04上测试。