为什么sed只通过管道显示一行

时间:2016-07-21 17:20:22

标签: unix sed

我在目录下有几个txt文件,我想查看每个文件的第一行

所以我用

ls *txt | xargs sed -n '1p'

然而它只返回第一个文件的一行

有什么问题?

P.S。:我知道我可以使用head,但我问的是sed无效的原因

3 个答案:

答案 0 :(得分:4)

使用参数-t到xargs查看发生了什么:

ls *txt | xargs -t sed -n '1p'

您将看到sed以:

运行
sed -n '1p' foo.txt bar.txt gar.txt

并且由于sed只支持一个输入文件,它将打印第一行 文件foo.txt并退出。

xargs假设你想要一起传递输入文件列表。

要告诉它一次传递一个,您需要使用-L NUM选项, 它告诉xargs从你的ls命令一次传递一行。 [注意,如果任何文件名中有空格,您将遇到其他问题]

ls *txt | xargs -L 1 -t sed -n '1p'

你会看到:

sed -n '1p' foo.txt 
sed -n '1p' bar.txt 
sed -n '1p' gar.txt

在unix中,有很多方法可以执行任何任务;其他方式包括:

(如果您使用/ bin / csh或/ bin / tcsh):

foreach f (*txt)
echo -n $f:
sed -1p $f
end

如果你使用/ bin / sh或/ bin / ksh,那么:

for files in *txt; 
do 
echo -n $files :
sed -n '1p' $files
done

还考虑使用程序查找;它允许您限定要查看的文件类型,并可以递归检查子目录:

`find . -type f -a -name "*txt" -print -a -exec sed -n '1p' {} \;`

答案 1 :(得分:2)

首先,lsxargs在这里没用。请阅读:"Don't Parse ls"。要获得适用于各种文件名的更可靠的命令形式,请使用:

sed -n '1p' *.txt

其次,sed将其输入文件全部视为一个流。所以,上面的做你想做的事。改为使用head(正如您所说):

head -n1 *.txt

要取消head打印的详细标题并使输出更像sed 1p,请使用-q选项:

head -qn1 *.txt

处理许多文件

如果你有很多.txt个文件,根据系统配置,"很多"可能意味着数万个这样的文件,然后需要另一种方法。 find很有用:

find . -maxdepth 1 -name '*.txt' -exec head -n1 {} +

答案 2 :(得分:2)

这可能适合你(GNU sed):

sed -s '1!d' file1 file2 file...

这将打印每个文件的第一行,即删除除每个文件的第一行之外的所有行。