0

我有这个脚本打印出第一行空白的文件:

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/
4

2 回答 2

3

我会亲自使用 sed

find ./ -type f -regex '.*\.php' -exec sed -i -e '1{/^[[:blank:]]*$/d;}' '{}' \;

这将找到所有以 .php 结尾的常规文件并执行仅在第一行工作的 sed 命令,并检查其是否为空白,如果是则将其删除,文件中的其他空白行不受影响。

于 2013-01-15T16:22:36.393 回答
1

只需使用findand sed

find . -type f -name "*.php" -exec sed -i '1{/^\s*$/d;q;}' {} \;

-type f选项仅查找文件,而不是我希望您使用.php后缀命名文件夹,但这是一种很好的做法。-regex '.*\.php'仅使用 globbing的使用是矫枉过正和混乱的-name "*.php"。使用 find-exec而不是 shell 脚本,该sed脚本将对通过find.

sed脚本仅查看第一行1并将内部的操作应用于{}该行。如果该行匹配,我们检查该行是否为空白,我们将其/^\s*$/删除d并退出q脚本,以便不读取文件中的所有其他行。该-i选项将更改保存回文件,因为默认行为sed是打印到stdout. 如果您想要使用后备文件, -i~这将为file~.file

于 2013-01-15T16:22:45.003 回答