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

时间:2018-06-11 15:28:45

标签: linux shell sed

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

我不想重命名文件,只需在适当的位置修改它们。

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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

sed命令中的替换遵循s/ItemToReplace/ItemToReplaceWith/pattern形式,其中s代表替换,pattern代表操作应该如何进行。 According to this super user post,为了匹配空格字符,您必须在sed命令中使用\s[[:space:]]。后者的区别在于POSIX合规性。最后,您需要指定一个全局操作,最后只是/ g。这只是用下划线替换文件中的所有空格。 sed命令中的替换遵循s/ItemToReplace/ItemToReplaceWith/pattern形式,其中s代表替换,pattern代表操作应该如何进行。 According to this super user post,为了匹配空白字符,您必须使用sed命令中的空格\s[[:space:]]。最后2个的区别在于空白捕获(制表符和空格),最后需要符合POSIX标准。最后,您需要指定一个全局操作,最后只是/ g。

因此,您的sed命令是

  

sed s/ /_/g FileNameHere

然而,这只能完成一半的任务。您还需要能够对目录中的每个文件执行此操作。不幸的是,通配符不会在sed命令中保存我们,因为* > *会不明确。您唯一的解决方案是遍历每个文件并单独覆盖它们。 For loops by default should come equipped with file iteration syntax,当与通配符一起使用时,会扩展到目录中的所有文件。但是,以这种方式使用的sed在重定向到文件时似乎完全失去输出。要更正此问题,您必须使用-i标志指定sed,以便编辑其文件。在-i标志之后传递的任何项目都将用于创建旧文件的备份。如果没有传递扩展名(例如-i ''),则不会创建任何备份。

因此,最终命令应该只是

  

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

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

答案 2 :(得分:0)

嗯......因为我试图让某些东西运转起来,我发现了一种适合我的方法:

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