【问题标题】:Delete all reoccurrences of first line in a file using sed使用 sed 删除文件中第一行的所有重复出现
【发布时间】:2014-04-26 14:35:56
【问题描述】:

我有一堆包含标题副本的多行文件。有没有办法使用 sed 删除除第一行之外的所有事件。我在想这样的事情:

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

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

【问题讨论】:

    标签: file unix sed find line


    【解决方案1】:

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

    【讨论】:

    • 使用 FNR 会更合适,因为 OP 计划将其用于多个文件(并计划将其用于文件 glob)
    • 只有在指定多个参数时才成立。如果 OP 选择 glob,那么我同意,FNR 将是一个更好的选择。已编辑,谢谢。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      sed -i '1 !{
         /textOnlyInHeader/ d
         }' file.txt 
      

      避免第一行并在另一行使用您的 sed

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • -1 需要“使用 sed 删除文件中第一行的所有重复出现”
        猜你喜欢
        • 2014-07-05
        • 2019-04-17
        • 1970-01-01
        • 2015-06-05
        • 2018-05-23
        • 2014-12-14
        • 2011-06-24
        • 2014-04-14
        • 1970-01-01
        相关资源
        最近更新 更多