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



我有一堆文件,其中有多行包含标头的副本。有没有一种方法可以使用sed删除除第一行以外的所有引用。我在想:

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

但这也会删除标题。作为奖励,有没有一种方法可以递归地对一堆子目录中的所有文件执行此操作?

我认为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

这可能对你有用(GNU sed(:

sed '1h;1b;G;/^(.*)n1$/!P;d' file
sed -i '1 !{
   /textOnlyInHeader/ d
   }' file.txt 

避开第一条线路,在另一条线路上使用你的sed

对于递归,您可以向sed传递一个文件列表(而不是文件.txt(。因此,在使用shell函数(find,ls,…,loop(之前准备该列表,并将其作为参数传递给sed

我知道使用gawk已经有一个可接受的答案,但使用sed:

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

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

相关内容

  • 没有找到相关文章

最新更新