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

Linux 从特定文件的开头删除换行符,linux,shell,unix,sed,Linux,Shell,Unix,Sed,我需要从所有扩展名为.php或.html的文件的一开始就删除任何出现的换行符(mac上的回车符)。换行符之间没有空格之类的字符 例如(使用/lf作为换行的示例): 但我不知道如何针对特定的文件,更不用说前几行了 因此,我有以下几点: find . \( -name "*.php" -or -name "*.html" \) | xargs grep -l "\012" | xargs sed -i -e "s/\012//g" 但这不会只针对前几行,而且我也不能完全确定它是否正确地针对行提要

我需要从所有扩展名为.php或.html的文件的一开始就删除任何出现的换行符(mac上的回车符)。换行符之间没有空格之类的字符

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

但我不知道如何针对特定的文件,更不用说前几行了

因此,我有以下几点:

find . \( -name "*.php" -or -name "*.html" \) | xargs grep -l "\012" | xargs sed -i -e "s/\012//g"
但这不会只针对前几行,而且我也不能完全确定它是否正确地针对行提要

有人有什么好主意吗?

试试:

sed -i '/./,$\!d' filename
或者甚至从find:

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

编辑:

之前的
\
!d
可能不需要,在我的shell中,我需要转义它,因为csh一直认为我通过
引用了以前的事件符号


编辑2:

因此,
/./,$\!d
,有点,看起来像胡言乱语,但事实就是这样

  • 这里定义了两个地址,第一个是regex
    ,它不是空行。因此,第一个地址是由
    /./
    匹配的第一个非空行
  • 然后我们有第二个地址,由
    分隔,它只是
    $
    ,文件的结尾。因此,由2个地址定义的区域是一直到文件末尾的第一个非空行
  • 我们将在这里使用sed的delete函数,它由脚本中最后一个
    d
    表示。但是,通过使用
    d
    ,我们将删除从第一个非空行开始到文件末尾的所有内容
  • 最后,因为我们将删除我们想要的东西,所以我们使用
    就在
    d
    命令的前面,告诉sed,“好的,做与我要你做的完全相反的事情”。因此,不是从第一个非空白行开始删除文件的末尾,而是完全相反,将第一个非空行保留到文件的末尾,这有删除文件开头的所有空白行的效果。
  • 使用
    p
    (print)命令可能有办法做到这一点,这有点像delete的反面,但实际上并不是这样。我相信有一些方法可以通过
    p
    实现这一点!p

    试试:

    sed -i '/./,$\!d' filename
    
    或者甚至从find:

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

    编辑:

    之前的
    \
    !d
    可能不需要,在我的shell中,我需要转义它,因为csh一直认为我通过
    引用了以前的事件符号


    编辑2:

    因此,
    /./,$\!d
    ,有点,看起来像胡言乱语,但事实就是这样

  • 这里定义了两个地址,第一个是regex
    ,它不是空行。因此,第一个地址是由
    /./
    匹配的第一个非空行
  • 然后我们有第二个地址,由
    分隔,它只是
    $
    ,文件的结尾。因此,由2个地址定义的区域是一直到文件末尾的第一个非空行
  • 我们将在这里使用sed的delete函数,它由脚本中最后一个
    d
    表示。但是,通过使用
    d
    ,我们将删除从第一个非空行开始到文件末尾的所有内容
  • 最后,因为我们将删除我们想要的东西,所以我们使用
    就在
    d
    命令的前面,告诉sed,“好的,做与我要你做的完全相反的事情”。因此,不是从第一个非空白行开始删除文件的末尾,而是完全相反,将第一个非空行保留到文件的末尾,这有删除文件开头的所有空白行的效果。

  • 使用
    p
    (print)命令可能有办法做到这一点,这有点像delete的反面,但实际上并不是这样。我相信有一些方法可以通过
    p
    实现这一点!p

    如果您已经安装了Perl,那么Perl非常适合这种类型的处理。您可以执行一个“do..until”循环,一旦找到一行非空白字符,它就会退出。不经意间:

    do {
    
      s/^\s$//;
    
    } until ( /^\S/ );
    

    (但是要先验证那些正则表达式是否执行了您希望它们执行的操作!)

    如果您已经安装了Perl,那么Perl非常适合这种类型的处理。您可以执行一个“do..until”循环,一旦找到一行非空白字符,它就会退出。不经意间:

    do {
    
      s/^\s$//;
    
    } until ( /^\S/ );
    
    (但请验证这些正则表达式是否执行了您希望它们首先执行的操作!)

    使用:

     find /path/to/root/directory -type f -exec tr -d '\012' {} \;
    
    其中/path/to/root/directory是查找所有文件以删除所有事件的顶级路径。

    使用:

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

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

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

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

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

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

    从文件中删除所有
    \f
    。OP只需要位于文件开头的那些从文件中删除所有
    \f
    。OP只需要文件开头的那些,你能解释一下“/。/,$\”表达式是什么吗!d'意味着?我创建了一个测试文件,其中包含:
    seq 4 | sed'1s/*/\n/;2s/*/\n\r/;3s/*/\r/;4s/*/'
    。此处
    sed'/[:blank:][]/,$!d'
    效果更好。@BrunovonParis编辑了答案,并详细解释了这些胡言乱语