我在这里找到了一些类似的问题,但没有找到这个问题,我不想破坏我的所有文件。我有一个文件列表,我只需要用下划线替换所有空格。我知道这是sed
命令,但我不确定如何将其一般地应用于每个文件。
我不想重命名文件,只需在适当的位置修改它们。
编辑:为了澄清,以防万一不清楚,我只想替换文件中的空格,不应该更改文件名。
答案 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