在多个文件中按行号打印一系列行
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 POSIX、sed
不会重置输入文件中的行号。
(如果 你有 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' *
例如:
在 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 POSIX、sed
不会重置输入文件中的行号。
(如果 你有 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' *