将文件列表传递给 sed 以删除所有文件中的一行

Pass a list of files to sed to delete a line in them all

我正在尝试执行一个单行命令,该命令将从一堆文件中删除第一行。文件列表将由 grep 命令生成。

grep -l 'hsv,vcv,tro,ztk' ${OUTPUT_DIR}/*.csv | tr -s "\n" " " | xargs /usr/bin/sed -i '1d'

问题是 sed 看不到要执行的文件列表on.I无法弄清楚命令有什么问题。请有人指出我的错误。

sed 中的行号计算在所有输入文件中。所以地址 1 每次 sed 调用只匹配一次。

在您的示例中,只会编辑列表中的第一个文件。

您可以使用这样的循环来完成您的任务:

grep -l 'hsv,vcv,tro,ztk' "${OUTPUT_DIR}/"*.csv |
while IFS= read -r file; do
    sed -i '1d' "$file"
done

除了上面 Dan 发布的解决方案外,唯一对我有用的解决方案是 -

for k in $(grep -l 'hsv,vcv,tro,ztk' ${OUTPUT_DIR}/*.csv | tr -s "\n" " ")
do
    /usr/bin/sed -i '1d' "${k}"
done

这可能对你有用(GNU sed 和 grep):

grep -l 'hsv,vcv,tro,ztk' ${OUTPUT_DIR}/*.csv  | xargs sed -i '1d'

-l 输出作为 xargs 参数接收的文件名。

-i 就地编辑文件并删除每个文件的第一行。

N.B。 sed 中的 -i 选项在每个文件级别工作,要为流中的每个文件使用行号,请使用 -s 选项。