我目前正在用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;
}
提前感谢您的时间。
答案 0 :(得分:3)
让我们从一个名为qq.in
的简单六行文件开始,该文件有两条非空行,两条空行和另外两条非空行:
a
b
c
d
cat -n
和cat -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
您可以像这样实现此功能