相关疑难解决方法(0)

我可以让 `cut` 就地更改文件吗?

man页面并没有给我太大希望,但我希望它是一个未记录的(和/或特定于 GNU 的)功能。

shell io-redirection cut files

20
推荐指数
3
解决办法
2万
查看次数

为什么 cat x >> x 循环?

以下 bash 命令进入无限循环:

$ echo hi > x
$ cat x >> x
Run Code Online (Sandbox Code Playgroud)

我可以猜测它在开始写入标准输出后会cat继续读取x。然而,令人困惑的是,我自己的 cat 测试实现表现出不同的行为:

// mycat.c
#include <stdio.h>

int main(int argc, char **argv) {
  FILE *f = fopen(argv[1], "rb");
  char buf[4096];
  int num_read;
  while ((num_read = fread(buf, 1, 4096, f))) {
    fwrite(buf, 1, num_read, stdout);
    fflush(stdout);
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我运行:

$ make mycat
$ echo hi > x
$ ./mycat x >> x
Run Code Online (Sandbox Code Playgroud)

不是循环。鉴于在再次调用之前cat我正在刷新的行为和事实,我希望这个 C 代码能够在一个循环中继续读取和写入。stdoutfread

这两种行为如何一致?什么机制解释了为什么 …

shell io-redirection files cat

18
推荐指数
1
解决办法
2078
查看次数

删除包含模式的行和之前的行

我想删除包含 pattern 的文件中的两行aaa bbb ccc

我使用了以下表达式,它删除了包含模式aaa bbb ccc的行和之前的行。

$ sed -n '/aaa bbb ccc/{s/.*//;x;d;};x;p;${x;p;}' file.txt | sed '/^$/d'
Run Code Online (Sandbox Code Playgroud)

这适用于一个文件。它不适用于多个文件

$ for i in *.txt; do sed -n '/aaa bbb ccc/{s/.*//;x;d;};x;p;${x;p;}' "$i" | sed '/^$/d'; done
Run Code Online (Sandbox Code Playgroud)

示例文件:

xxx
yyy
aaa bbb ccc
eee
fff
aaa bbb ccc
ggg
hhh
Run Code Online (Sandbox Code Playgroud)

结果文件:

xxx
eee
ggg
hhh
Run Code Online (Sandbox Code Playgroud)

sed

3
推荐指数
1
解决办法
5556
查看次数

标签 统计

files ×2

io-redirection ×2

shell ×2

cat ×1

cut ×1

sed ×1