我在目录下有几个txt文件,我想查看每个文件的第一行
所以我用
ls *txt | xargs sed -n '1p'
然而它只返回第一个文件的一行
有什么问题?
P.S。:我知道我可以使用head
,但我问的是sed
无效的原因
答案 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)
首先,ls
和xargs
在这里没用。请阅读:"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...
这将打印每个文件的第一行,即删除除每个文件的第一行之外的所有行。