cat -b 和 cat -n 之间有什么区别以及 cat -s 如何工作
What is the difference between cat -b and cat -n and how cat -s does work
我目前正在用 C 和 unix 开发一个 cat 命令。这次我的任务是设计 cat -b 和 cat -s 命令。但是我已经创建了其他命令,例如 -t、-v、-n、-e。我卡在命令 -b 中,因为每当我触发命令时,它 returns 输出相同的 -n returns.
例如
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;
}
在此先感谢您的宝贵时间。
让我们从一个名为 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
请注意,这些行必须 确实 为空,如果这些行包含 space 或其他一些白色-[=,这些标志将不会执行您期望的操作33=]。如果你想将 white-space 行视为空行,你可以先用类似的东西过滤它们:
sed -E 's/^\s+$//' qq.in | cat -b
-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
您可以像这样实现此功能
- 将文件读入缓冲区
- 检查缓冲区是否包含连续空行,例如“\n\n\n”
- 放在一起,只用一个"\n"而不是一组
问题:
What is the difference between cat -b and can -n and how cat -s does work
来自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;
}
我目前正在用 C 和 unix 开发一个 cat 命令。这次我的任务是设计 cat -b 和 cat -s 命令。但是我已经创建了其他命令,例如 -t、-v、-n、-e。我卡在命令 -b 中,因为每当我触发命令时,它 returns 输出相同的 -n returns.
例如
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;
}
在此先感谢您的宝贵时间。
让我们从一个名为 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
请注意,这些行必须 确实 为空,如果这些行包含 space 或其他一些白色-[=,这些标志将不会执行您期望的操作33=]。如果你想将 white-space 行视为空行,你可以先用类似的东西过滤它们:
sed -E 's/^\s+$//' qq.in | cat -b
-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
您可以像这样实现此功能
- 将文件读入缓冲区
- 检查缓冲区是否包含连续空行,例如“\n\n\n”
- 放在一起,只用一个"\n"而不是一组
问题:
What is the difference between cat -b and can -n and how cat -s does work
来自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; }