繁体   English   中英

用下划线替换目录中所有文件中的空格

[英]Replace spaces in all files in a directory with underscores

我在这里找到了一些类似的问题,但没有找到这个特定的问题,我也不想破坏我的所有文件。 我有一个文件列表,我只需要用下划线替换所有空格。 我知道这是一个sed命令,但是我不确定如何将其通用地应用于每个文件。

我不想重命名文件,只需就地修改它们即可。

编辑:为澄清起见,以防万一,我只想替换文件中的空格,不应更改文件名。

find . -type f -exec sed -i -e 's/ /_/g' {} \;

find获取目录(和子目录)中所有文件的所有项目,并使用{} \\;将这些文件名作为参数传递给sed命令{} \\; 符号。 似乎您已经了解了sed命令。

如果只想搜索当前目录并忽略子目录,则可以使用

find . -maxdepth 1 -type f -exec sed -i -e 's/ /_/g' {} \;

这是一个两部分的问题。 步骤1提供正确的sed命令,步骤2提供正确的命令来替换给定目录中的所有文件。

sed命令中的替换格式为s/ItemToReplace/ItemToReplaceWith/pattern ,其中s表示替换,而pattern表示操作方式。 根据此超级用户帖子 ,为了匹配空格字符,您必须在sed命令中使用\\s[[:space:]] 后者的区别在于POSIX合规性。 最后,您需要指定一个全局操作,其末尾只是/ g。 这只是用下划线替换文件中的所有空格。 sed命令中的替换格式为s/ItemToReplace/ItemToReplaceWith/pattern ,其中s表示替换,而pattern表示操作方式。 根据此超级用户帖子 ,为了匹配空格字符,您必须在sed命令中仅使用空格\\s[[:space:]] 区别在于最后两个是空格捕获(制表符和空格),最后一个是POSIX合规性所需的。 最后,您需要指定一个全局操作,其末尾只是/ g。

因此,您的sed命令是

sed s/ /_/g FileNameHere

但是,这只能完成一半的任务。 您还需要能够对目录中的每个文件执行此操作。 不幸的是,通配符不会将我们保存在sed命令中,因为* > *会模棱两可。 您唯一的解决方案是遍历每个文件并分别覆盖它们。 对于for循环,默认情况下应配备文件迭代语法 ,并且与通配符一起使用时,扩展到目录中的所有文件。 但是,以这种方式使用sed时,在重定向到文件时似乎完全失去了输出。 要更正此问题,您必须使用-i标志指定sed,以便它将编辑其文件。 -i标志之后传递的所有项目都将用于创建旧文件的备份。 如果没有传递扩展名(例如-i '' ),则不会创建备份。

因此,最终命令应该只是

for i in *;do sed -i '' 's/ /_/g' $i;done

它会在当前目录中查找所有文件,并将sed输出回显到所有文件(目录确实会列出,但不会对其执行任何操作)。

好吧……由于我一直想让某件事运行,所以我找到了一种对我有用的方法:

for file in `ls`; do sed -i 's/ /_/g' $file; done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM