例如:
在sed中两行之间打印是:
sed -n '30,40p' filename
但是,当我用它时:
sed -n '30,40p' *
它只打印第一个文件的30到40之间的行。
一堆文件怎么样?
答案 0 :(得分:3)
尝试使用for循环:
for i in ./*
do
sed -n '30,40p' "$i"
done
答案 1 :(得分:3)
Per POSIX,sed
不会重置输入文件的行编号。
(如果你有 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
。