从特定文件的开头删除换行符

时间:2012-10-20 08:17:36

标签: linux shell unix sed

我需要从具有.php或.html扩展名的所有文件的最开头删除任何出现的换行符(在mac上回车)。换行符之间有 no 其他字符,如空格或任何东西。

例如(使用/ lf作为换行的示例):

/lf
/lf
<!doctype html>

/lf
<!doctype html>

应该减少到:

<!doctype html>

我发现删除换行符的一种方法是:

tr -d '\012'

但我不知道如何在特定文件中定位,更不用说前几行了。

所以我有以下内容:

find . \( -name "*.php" -or -name "*.html" \) | xargs grep -l "\012" | xargs sed -i -e "s/\012//g"

但是这不会只针对前几行,我也不完全确定它是否正确定位了换行符。

那么,有没有人有任何好主意?

4 个答案:

答案 0 :(得分:2)

尝试:

sed -i '/./,$\!d' filename

甚至是发现:

find . \( -name "*.php" -or -name "*.html" \) -exec sed -i '/./,$\!d' {} \;

编辑:

\可能不需要!d,在我的shell中我需要逃避它,因为csh一直认为我是通过!符号引用之前的事件。


编辑2:

所以/./,$\!d,它看起来像胡言乱语,但这就是正在发生的事情。

  1. 此处定义了2个地址,第一个是正则表达式.,它不是空白行。因此,第一个地址是第一个与/./匹配的非空行。
  2. 然后我们有第二个地址,由,分隔,它只是$,即文件的结尾。因此,我们通过2个地址定义的区域是第一个非空白行,一直到文件末尾。
  3. 我们将在这里使用sed的删除功能,该功能由脚本中的最后一个d表示。但是,通过使用d,我们将删除从第一个非空白行开始到文件末尾的所有内容。
  4. 最后,因为我们要删除我们想要的东西,我们在!命令前面使用d来告诉sed,“好吧,做的恰恰相反我告诉你要这样做“。因此,我们不是删除从第一个非空白行开始到文件末尾的所有内容,而是完全相反,保留第一个非空行到文件末尾,这样就删除了所有内容。文件开头的空白行。
  5. 可能有一些方法可以使用p(打印)命令执行此操作,该命令与类似与删除相反,但实际上并不是那样。我确信有一些方法可以使用p!p来完成此操作。

答案 1 :(得分:2)

如果已安装Perl,Perl适用于此类处理。你可以做一点“do .. until”循环,一旦找到一个带有非空格字符的行就会退出。在我的头顶:

do {

  s/^\s$//;

} until ( /^\S/ );

(但要验证那些正则表达式首先执行您想要的操作!)

答案 2 :(得分:0)

使用:

 find /path/to/root/directory -type f -exec tr -d '\012' {} \;

其中/ path / to / root / directory是查找所有文件以删除所有匹配项的顶级路径。

答案 3 :(得分:0)

如果您知道换行仅在第一行,例如10行,则可以更改SED命令,使其仅在前十行上运行。这是下面的1,10

xargs sed -i -e "1,10s/\012//g"