bash - 在多个文件中按行号打印一系列行

标签 bash awk sed iteration glob

例如:
在 sed 中打印两行之间的所有内容是:

sed -n '30,40p' filename

但是,当我将它用作:

sed -n '30,40p' *

它只打印第一个文件的第 30 到 40 行。

一堆文件怎么办?

最佳答案

Per POSIX , sed 不会重置输入文件中的行号。
(如果您有 GNU sed,您可以使用 -s 选项 - 见底部)。

虽然您可以使用shell 循环 来解决这个问题(for f in *; sed ...; done),但它是使用单个 awk 命令效率更高,其中内置变量 FNR 反射(reflect)输入文件相对行号(从 1 开始):

awk 'FNR >= 30 && FNR <= 40' *

此解决方案符合 POSIX 标准。


如果您有 GNU sed,请使用 -s 选项为每个输入文件重新开始行编号:

sed -s -n '30,40p' *

关于bash - 在多个文件中按行号打印一系列行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38690131/

相关文章:

linux - 使用 sed 将文件中的行替换为另一个文件

regex - sed 正则表达式及其替代方案在 Solaris 上不起作用

正则表达式删除字符串的中间部分并向前看

bash - 如何在 shell 脚本中记录带有时间戳的 echo 语句

javascript - 如何使用 cron 从 bash 运行 Node 脚本

shell - 如何使用 shell 转换为日期格式 (DD MMM YYYY)?

shell - 在shell脚本中映射文件的对应值

python-3.x - 当我在终端上运行 python -v 而不是 python -V 时会发生什么?

python - 在 python/bash 中打印带有条件的特定范围的行

linux - 如何在 linux 中用另一行替换行