0

我需要从所有扩展名为 .php 或 .html 的文件的开头删除任何出现的换行符(Mac 上的回车符)。换行符之间没有其他字符,例如空格或任何其他字符

例如(使用 /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

4 回答 4

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,“好吧,做与我告诉你做的完全相反的事情”。因此,我们不是删除从第一个非空行到文件末尾的所有内容,而是完全相反,将第一个非空行保留到文件末尾,这具有删除所有文件开头的空白行。

使用p(print) 命令可能有某种方法可以做到这一点,这有点像delete 的反面,但实际上并不是那样的。我确信有一些方法可以使用por来做到这一点!p

于 2012-10-20T08:28:07.820 回答
2

如果您安装了 Perl,那么它非常适合这种类型的处理。你可以做一个小“do .. until”循环,一旦找到包含非空白字符的行就退出。在我的头顶上:

do {

  s/^\s$//;

} until ( /^\S/ );

(但请先验证这些正则表达式是否按照您的要求执行!)

于 2012-10-20T08:28:08.393 回答
0

利用:

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

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

于 2012-10-20T08:29:26.523 回答
0

如果您知道换行符仅在前 10 行中,那么您可以更改 SED 命令,使其仅在前 10 行中运行。就是1,10下面这个。

xargs sed -i -e "1,10s/\012//g"
于 2012-10-22T02:36:10.977 回答