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

Print a range of lines by line numbers across multiple files

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

sed -n '30,40p' filename

但是,当我将它用作:

sed -n '30,40p' *

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

一堆文件呢?

尝试使用 for 循环:

for i in ./*
do
 sed -n '30,40p' "$i"
done

使用 for 循环

for i in */* # */* will do the recursion
do sed -n '30,40p' "$i" # double quote the variable to avoid word splitting
done

或者,如果您想要更多地控制文件选择,请使用 find

find . -type f "*.txt" -exec sed -n '30,40p' {} \;

这将递归查找所有扩展名为 .txt 的文件并将其传递给 sed

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

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

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

此解决方案 POSIX 兼容。


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

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