使用sed删除文件中所有出现的第一行

时间:2014-03-20 00:48:17

标签: file unix sed find line

我有一堆文件,其中多行包含标题的副本。有没有办法使用sed删除除第一行以外的所有实例。我想的是:

sed -i '/textOnlyInHeader/d' file.txt

除此之外还会删除标题。作为奖励,有没有办法递归地为一堆子目录中的所有文件执行此操作?

4 个答案:

答案 0 :(得分:3)

我认为gawk最适合这个。尝试:

gawk -i inplace 'NR==1 { r = $0; print } r == $0 { next }1' file.txt

对于单个目录中的所有文件,将NR更改为FNR并运行:

gawk -i inplace '...' *.txt

对于许多子目录中的所有文件,您可以使用for循环:

for i in $(find /path/to/files -type f -name '*.txt'); do ... ; done

如果您使用的是旧的或非GNU AWK,则需要先写入临时文件:

awk '...' file.txt > file.tmp && mv file.tmp file.txt

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed '1h;1b;G;/^\(.*\)\n\1$/!P;d' file

答案 2 :(得分:1)

sed -i '1 !{
   /textOnlyInHeader/ d
   }' file.txt 

避免第一行并在其他行上使用你的sed

对于递归,你可以传递sed文件列表(代替file.txt)。因此,在使用shell函数(find,ls,...,loop)之前准备列表,并将其作为参数传递给sed

答案 3 :(得分:-1)

我知道使用gawk已经接受了答案,但使用了sed

sed -i -e '2,$s/textOnlyInHeader/DELETELINE/' -e '/DELETELINE/d' file.txt

对于递归回答,我同意Steve的观点,即使用find的循环是可行的。