Unix 为什么sed只显示管道中的一条线

Unix 为什么sed只显示管道中的一条线,unix,sed,Unix,Sed,我在一个目录下有几个txt文件,我想看到每个文件的第一行 所以我用 ls *txt | xargs sed -n '1p' 但是,它只返回第一个文件的一行 怎么了 注:我知道我可以使用head,但我要问的是为什么sed不起作用使用参数-t到xargs来查看发生了什么: ls *txt | xargs -t sed -n '1p' 您将看到sed的运行方式如下: sed -n '1p' foo.txt bar.txt gar.txt 由于sed只支持一个输入文件,它将打印输入文件的第一行 文

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

所以我用

ls *txt | xargs sed -n '1p'
但是,它只返回第一个文件的一行

怎么了


注:我知道我可以使用
head
,但我要问的是为什么
sed
不起作用

使用参数-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):

如果使用/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' {} \;`

首先,
ls
xargs
在这里没有用处。请阅读:。要获得适用于各种文件名的更可靠的命令形式,请使用:

sed -n '1p' *.txt
其次,
sed
将其所有输入文件视为一个流。所以,上面所说的并不是你想要的。改用
head
(如您所说):

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

head -qn1 *.txt
处理许多文件 如果您有许多
.txt
文件,根据系统配置,“许多”可能意味着数万个这样的文件,那么需要另一种方法<代码>查找很有用:

find . -maxdepth 1 -name '*.txt' -exec head -n1 {} +
这可能适用于您(GNU-sed):


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

@hek2mgl此外,鉴于OP的目标似乎是学习新的工具,您对awk的担忧是什么?如果效率很重要,那么
gawk'FNR==1{print;nextfile;}'*.txt
。我对
awk
没有任何顾虑。但是
head
只是一个简单的方法(imo)。我只是觉得用
head
来表达它的意图要干净得多
awk
有很多有用的领域,让我们保留一个好的
head
:)谢谢你,约翰1024<代码>-q真的很方便!引用您的变量,
sed
确实支持多个文件,但是(除非
-i
)正如John所说,它将所有文件都视为一个流,因此
1p
是第一个文件的第一行。有很多很好的答案。但我最终决定接受你的。因为你解释了更多关于管道和xargs的细节。谢谢。或者
sed-sn'1p'*.txt
+1用于查找
-s
标志:这是OP需要的。很棒的
-s
选项!非常感谢。
head -qn1 *.txt
find . -maxdepth 1 -name '*.txt' -exec head -n1 {} +
sed -s '1!d' file1 file2 file...