1 个评论
linux
grep
text-processing
user191960
user191960
发布于 2009-10-23
11 个回答
DigitalRoss
DigitalRoss
发布于 2020-08-22
已采纳
0 人赞同

grep . FILE

(如果你真的想用sed来做,那么: sed -e /^$/d FILE )

(如果你真的想用awk来做,那么: awk /./ FILE )

很好!谢谢你的其他命令 - 但看起来grep是我最好的新朋友。
grep .FILE对我不起作用。也许坚持用grep来搜索文件内容,用sed来编辑文件内容会更好。
sed -ne/./p 也可以,而 awk /./ 更短(如果没有指定,动作是 {print} )。 @ghostdog74:那就 grep '[^[:space:]]'
对于那些不了解的人来说, . 是一个正则表达式,可以匹配除换行之外的任何字符。
grep . FILE 在给定的例子中起作用,但当文件中可能有不属于字符集的字节时就不一定了。例如,在GNU grep 2.20中, printf "\x80\n" | grep . 没有输出。
Mr.Ree
Mr.Ree
发布于 2020-08-22
0 人赞同

Try the following:

grep -v -e '^$'
    
这与grep .FILE的效果相同,因为空格是一个空行,会被抓取。
"grep "寻找任何与该模式相匹配的行。 ". "匹配任何字符。 "grep .FILE "匹配任何至少有一个字符的行。 而 "grep -v "则排除了符合模式的行。 OP说 "删除所有空的新行"。 如果你想排除只有空格的行,"grep -v '^ $'". The " "将匹配前面模式中的零个或多个,在本例中是空格。 尽管你可能更喜欢匹配并排除其他空白字符(制表符、换行符等)。
这种方法使我能够更容易地组合多个排除法,而不仅仅是 "grep .FILE"。例如,我在看一个配置文件,想排除所有评论行和所有空行。所以我使用 "grep -v -e '#' -e '^$' squid.conf"。这很有效。
这个比'grep .FILE'。这是由于验证重组词'.'的任务更加复杂,而不是在^$不匹配时就排除。
grep -v -e '^$' 总是有效,而 grep . 则不然。例如,在GNU grep 2.20中, printf "\x80\n" | grep . 没有输出,而 printf "\x80\n" | grep -v '^$' 输出非空行。
ghostdog74
ghostdog74
发布于 2020-08-22
0 人赞同
with awk, just check for number of fields. no need regex
$ more file
hello
world
$ awk 'NF' file
hello
world
    
不需要引号。 这个技巧可以在 awk1line.txt 中找到。-- 然后,大多数awk技巧也是如此:)
因为你是在shell下运行的,所以加引号是我的好习惯。对于复合awk语句,你仍然要加引号。
Marco Coutinho
Marco Coutinho
发布于 2020-08-22
0 人赞同

这里有一个解决方案,可以删除所有空白或只包含空格字符的行。

grep -v '^[[:space:]]*$' foo.txt
    
kenorb
kenorb
发布于 2020-08-22
0 人赞同

如果删除空行是指包括任何空格的行,则使用。

grep '\S' FILE
$  printf "line1\n\nline2\n \nline3\n\t\nline4\n" > FILE
$  cat -v FILE
line1
line2
line3
line4
$  grep '\S' FILE
line1
line2
line3
line4
$  grep . FILE
line1
line2
line3
line4
  • How to remove empty/blank lines (including spaces) in a file in Unix?
  • How to remove blank lines from a file in shell?
  • With sed: Delete empty lines using sed
  • With awk: Remove blank lines using awk
  • Deepak Shinde
    Deepak Shinde
    发布于 2020-08-22
    0 人赞同

    最简单的答案 -----------------------------------------

    [root@node1 ~]# cat /etc/sudoers | grep -v -e ^# -e ^$
    Defaults   !visiblepw
    Defaults    always_set_home
    Defaults    match_group_by_gid
    Defaults    always_query_group_plugin
    Defaults    env_reset
    Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
    Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
    Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
    Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
    Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
    Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
    root    ALL=(ALL)       ALL
    %wheel  ALL=(ALL)       ALL
    [root@node1 ~]#
        
    Prabhat Kumar Singh
    Prabhat Kumar Singh
    发布于 2020-08-22
    0 人赞同

    Try this: sed -i '/^[ \t]*$/d' file-name

    它将删除文件中任何数量的空白行(空格或制表符),即(0或以上)。

    注意:方括号内有一个 "空格",后面是"/t"。

    修改器 -i 将强制把更新的内容写回文件中。如果没有这个标志,你可以看到屏幕上的空行被删除,但实际的文件不会受到影响。

    clblue2000
    clblue2000
    发布于 2020-08-22
    0 人赞同

    grep '^..' my_file

    EOF_MYFILE

    它只输出至少有两个字符的行。

    EOF_MYFILE

    也请看有 grep '^' my_file 输出的结果。

    EOF_MYFILE

    并有 grep '^.' my_file 输出

    EOF_MYFILE
    kenorb
    kenorb
    发布于 2020-08-22
    0 人赞同

    Try ex -道。

    ex -s +'v/\S/d' -cwq test.txt
    

    对于多个文件(就地编辑)。

    ex -s +'bufdo!v/\S/d' -cxa *.txt
    

    无需修改文件(只需在标准输出上打印)。

    cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin
        
    Chris Koknat
    Chris Koknat
    发布于 2020-08-22
    0 人赞同

    Perl可能是矫枉过正,但它也同样有效。

    删除所有完全空白的行。

    perl -ne 'print if /./' file
    

    删除所有完全空白的行,或只包含空白的行。

    perl -ne 'print if ! /^\s*$/' file
    

    变化,它编辑了原件并制作了一个.bak文件。

    perl -i.bak -ne 'print if ! /^\s*$/' file
        
    Chrispy
    Chrispy
    发布于 2020-08-22
    0 人赞同

    如果你想知道你的Xcode项目中的总代码行数,而且你对列出每个swift文件的数量不感兴趣,那么这个会给你答案。 它删除了完全没有代码的行,并删除了以注释 // 为前缀的行。

    在你的Xcode项目的根层运行它。

    find . \( -iname \*.swift \) -exec grep -v '^[[:space:]]*$' \+ | grep -v -e '//' | wc -l
    

    如果你的代码中有以/*开头,以*/结尾的注释块,如:。