从多个文件删除线,sed命令(Removing lines from multiple files

2019-10-23 05:21发布

所以,免责声明:我是相当新的使用bash和zsh的,所以有机会的话,答案是非常简单的。 尽管如此。 我查了一下以前的贴子,但没有找到任何东西。 (编辑:我已经在这两个bash和zsh中shells-同样的问题,尝试这样做。)

我有很多文件的目录,我试图删除每一个文件的第一行。

所以说该目录包含:FILE1.TXT FILE2.TXT file3.txt ...等等。

我使用sed命令(非GNU):

sed -i -e "1d" *.txt

出于某种原因,这只是去掉第一个文件的第一行。 我认为,* .TXT会影响匹配的目录模式中的所有文件。 奇怪的是,创建与-e附加文件副本,但两者的重复和原来是一样的。

我想这与其他命令(如LS * .TXT),它工作正常。 是否有一些关于sed的我失踪?

先感谢您。

Answer 1:

不同版本的sed 。在不同的操作系统都支持各种参数。

OpenBSD的(5.4)的sed

-i标志不可用。 您可以使用下面的/bin/sh语法:

for i in *.txt
do
    f=`mktemp -p .` 
    sed -e "1d" "${i}" > "${f}" && mv -- "${f}" "${i}"
done

FreeBSD的(11-CURRENT)的sed

-i标志需要一个扩展,即使它是空的。 因此,必须写成sed -i "" -e "1d" *.txt

GNU的sed

这看起来,看看下面的参数-i是另一种选择(或可能的命令)。 如果是这样,它假定就地修改。 如果这似乎是一个文件扩展名,如“ .bak ”,将重命名原始的“ .bak ”,然后修改成原来的文件名。

可能有其他平台上的其他变化,但这些都是三我手边。



Answer 2:

  1. 使用它没有-e!

一个文件的使用:

sed -i '1d' filename

所有文件的使用:

sed -i '1d' *.txt

要么

files=/path/to/files/*.extension ; for var in $files ; do sed -i '1d' $var ; done

。对于我,我使用Ubuntu和基于Debian的系统,这种方法为我工作100%,但对其他platformes我不知道,所以这是另一种方法:

  1. 替换emty图案第一线,并取出空行,(双命令):

    在$文件(LS /path/to/files/*.txt); 做的sed -i “S / $(头-1 ”$文件“)// G” “$文件”; SED -i '/ ^ $ / d' “$文件”; DONE

注意:如果你的文件包含飞溅“/”,那么它会给错误,所以在这种情况下,sed的命令应该是这样的( sed -i "s[$(head -1 "$files")[[g"

希望这是你在找什么:)



Answer 3:

这里的问题是,当sed的打开一个新的文件,所以行号没有被复位1只有第一个文件的第一行相匹配。

一个解决方案是使用shell循环,为每个文件调用sed的一次。 Gumnos的回答显示了如何做到这一点的最广泛兼容的方式,但如果你有一个版本sed的支持-i标志,你可以这样做,而不是:

for i in *.txt; do
    sed -i.bak '1d' "$i"
done

它可以通过传递一个空后缀以避免创建备份文件,但就个人而言,我不认为这是一件坏事。 有一天,你会对此表示感谢!


看来,你不GNU工具工作,但如果你是,我会建议使用GNU AWK这项任务。 变量FNR在这里很有用,因为它可以追踪每个文件的记录号的个人,可以让你做到这一点:

gawk -i inplace 'FNR>1' *.txt

使用inplace延伸,这可以让你删除每个文件的第一行,只打印在线条FNR大于1。

测试一下:

$ seq 5 > file1
$ seq 5 > file2
$ gawk -i inplace 'FNR>1' file1 file2
$ cat file1
2
3
4
5
$ cat file2
2
3
4
5


Answer 4:

你传递给桑达最后一个参数是问题尝试这样的事情。

var=(`find *txt`)
for file in "${var[@]}"
do
    sed -i -e 1d $file
done

这奏效了我。



文章来源: Removing lines from multiple files with sed command