我有这个脚本打印出第一行空白的文件:
for f in `find . -regex ".*\.php"`; do
for t in head; do
$t -1 $f |egrep '^[ ]*$' >/dev/null && echo "blank line at the $t of $f";
done;
done
如何改进这一点以实际删除空行,或者至少将所有文件复制到其他地方的空白第一行。
我尝试使用这个复制,这很好,因为它复制保留了目录结构,但是它复制了每个php文件,我需要捕获egrep的正面输出并且只复制这些文件。
rsync -R $f ../DavidSiteBlankFirst/
答案 0 :(得分:2)
我会亲自使用sed
find ./ -type f -regex '.*\.php' -exec sed -i -e '1{/^[[:blank:]]*$/d;}' '{}' \;
这会查找以.php结尾的所有常规文件,并执行仅在第一行上工作的sed命令,并检查其是否为空并删除它,如果是,则文件中的其他空行不受影响。
答案 1 :(得分:1)
只需使用find
和sed
:
find . -type f -name "*.php" -exec sed -i '1{/^\s*$/d;q;}' {} \;
-type f
选项只能查找文件,而不是我希望您为后缀为.php
的文件夹命名,但这是一种很好的做法。使用全局-regex '.*\.php'
使用-name "*.php"
是过度和杂乱的。使用find -exec
而不是shell脚本,sed
脚本将对find
传递的每个匹配文件进行操作。
sed
脚本仅查看第一行1
,并将{}
内的操作应用于该行。我们检查该行是否为空/^\s*$/
如果该行匹配,我们删除它d
并退出q
脚本,以便不读取文件中的所有其他行。 -i
选项会将更改保存回文件,因为sed
的默认行为是打印到stdout
。如果您希望返回文件使用-i~
,则会为file~
创建一个反向文件file
。