【问题标题】:Removing last blank line删除最后一个空行
【发布时间】:2010-12-15 10:16:00
【问题描述】:

在我的 .csv 文件末尾有一个段落中断。我尝试使用以下命令删除文件末尾的空白行。

sed -i '/^$/d' combined.csv

但它不起作用,并且仍然存在空白行。我可以使用以下命令删除最后一行。

sed -i '$d' combined.csv

但是是否可以在删除之前检查最后一行是否真的为空?

更新:

我正在使用以下命令来检查每一行是否以数字开头。

sed -i '1s/^[^0-9]*//' combined.csv

这仅检查第一行而不检查其余行。如何让它检查文件中的所有行?这可能会解决我的问题。

【问题讨论】:

    标签: sed awk grep


    【解决方案1】:

    试试${/^$/d;}这只会匹配一个空行,如果它是文件的最后一行。

    更新:对于第二个问题,只需删除 s 之前的 1,即:sed -i 's/^[^0-9]*//' combined.csv

    【讨论】:

    • 谢谢,这行得通!您能否详细说明第一个 sed 命令?
    • ${/^$/d;}:第一个$ 表示文件的最后一行(您可以将命令限制为行号,$ 表示最后一行)。花括号表示一个块,在块内删除/d; 一个空行/^$
    【解决方案2】:

    很久以前在某个地方找到了这个并保存了sn-p。不要问我它是如何工作的:

    perl -i -pe "chomp if eof" combined.csv
    

    【讨论】:

    • 如果在 EOF (\n\n) 处没有空行,这也将删除 EOF 处的最后一个 \n - 在 Unix 中不应删除。
    • @AleksandrLevchuk:好点,但这很容易解决:perl -pe 'chomp if eof && /^$/' combined.csv
    【解决方案3】:

    试试 ${/^$/d;} 这只会匹配一个空行,如果它是文件的最后一行。

    我用 sed (GNU sed) 4.2.2 进行了尝试,并且删除了所有空行,不仅是空行(如果它是文件的最后一行)。

    我找到了以下命令,它对我自己有用。

    sed -e :a -e '/^\n*$/{$d;N;ba' -e '}'
    

    此命令来自有用的 SED-Oneliner 集合: http://sed.sourceforge.net/sed1line.txt

    【讨论】:

    • $ {/^$/d;} 应该可以正常工作,与任何 POSIX 兼容的sed 一起使用。试试sed '$ {/^$/d;}' <<<$'a\n\nb\n',你会看到只有最后一行被删除了。
    • 您的替代方案做了一些不同的事情:它修剪所有额外的尾随换行符,而不仅仅是最后一个换行符,它还一次读取整个文件 ,在这种情况下这是不必要的,并且对于大文件有问题。
    【解决方案4】:

    要删除空白行,您可以使用grep .sed '/^$/d'

    它将删除文件中的任何空白行。我希望您的文件中间没有任何空行,但这适用于您的情况。

    cat combined.csv | grep .

    cat combined.csv | sed '/^$/d'

    【讨论】:

      【解决方案5】:

      如果您确定最后一行是,那么只需使用:...| head -n -1 | ...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多