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

时间:2016-08-01 02:14:38

标签: bash awk sed iteration glob

例如:
在sed中两行之间打印是:

sed -n '30,40p' filename

但是,当我用它时:

sed -n '30,40p' *

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

一堆文件怎么样?

3 个答案:

答案 0 :(得分:3)

尝试使用for循环:

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

答案 1 :(得分:3)

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

虽然可以使用 shell循环来解决此问题(for f in *; sed ...; done),但使用单个{{1>更有效率}}命令,其中内置变量awk反映输入文件相对行号(从1开始):

FNR

此解决方案符合POSIX标准。

如果你有 GNU awk 'FNR >= 30 && FNR <= 40' * ,请使用sed选项为每个输入文件重新开始行编号:

-s

答案 2 :(得分:1)

使用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