cat -b和cat -n之间的区别是什么以及cat -s是如何工作的

时间:2015-03-16 03:39:32

标签: c linux unix cat

我目前正在用C和unix开发一个cat命令。我的任务是设计cat -b和cat -s命令。但是我已经创建了其他命令,如-t,-v,-n,-e。我遇到了命令-b,因为每当我触发命令时它都会返回相同的输出-n返回。

例如

cat -n hello.c

1  #include<studio.h>
2    int main() {
3      printf("hello");
4      return 0;
5   }

cat -b hello.c

1  #include<studio.h>
2    int main() {
3      printf("hello");
4      return 0;
5   }

我的第二个问题是cat -s是如何工作的?当我再次触发命令但输出显示一个简单的c文件而没有任何改变。

例如

cat -s hello.c

 #include<studio.h>
   int main() {

    printf("hello");

     return 0;
 }

提前感谢您的时间。

3 个答案:

答案 0 :(得分:3)

让我们从一个名为qq.in的简单六行文件开始,该文件有两条非空行,两条空行和另外两条非空行:

a
b


c
d

cat -ncat -b之间的区别在于前者会将所有行编号,而后者只会编号非空行:

$ cat -n qq.in       $ cat -b qq.in
     1  a                 1  a
     2  b                 2  b
     3                    
     4                    
     5  c                 3  c
     6  d                 4  d

另一方面,cat -s会将连续的空行折叠为空行,如下所示(与-n结合使用效果显而易见):

$ cat -ns qq.in
     1  a
     2  b
     3
     4  c
     5  d

请注意,这些行必须真正为空,如果这些行包含空格或其他空格,这些标志将无法执行您所期望的操作。如果要将空白行视为空,则可以先使用以下内容对其进行过滤:

sed -E 's/^\s+$//' qq.in | cat -b

答案 1 :(得分:3)

问题:

  

cat -b和can -n之间有什么区别以及cat -s如何工作

来自man cat的输出:

  -b, --number-nonblank
          number nonempty output lines, overrides -n

  -n, --number
          number all output lines

  -s, --squeeze-blank
          suppress repeated empty output lines

使用cat -b时,空行不会被编号。

这里是我用简单文件看到的内容:

cat -b socc.cc

     1  #include 

     2  int main()
     3  {
     4     return 0;
     5  }


cat -n socc.cc

     1  #include 
     2  
     3  int main()
     4  {
     5     return 0;
     6  }
     7  
     8  

cat -s socc.cc

#include 

int main()
{
   return 0;
}

答案 2 :(得分:1)

 -b, --number-nonblank

    number nonblank output lines

 -n, --number

    number all output lines

参考:cat manpage

和第二个问题,来自手册页:

  

-s, - squeeze-blank

    never more than one single blank line

您可以像这样实现此功能

  1. 将文件读入缓冲区
  2. 检查缓冲区是否包含连续的空行,例如“\ n \ n \ n”
  3. 将它们放在一起,只使用一个“\ n”而不是一组