【问题标题】:Find string in file and delete two lines after在文件中查找字符串并删除之后的两行
【发布时间】:2017-02-04 18:20:35
【问题描述】:

我对 bash 很陌生,我想知道如何在文件中查找字符串并从找到的字符串开始删除两行。

我的文件格式如下:

username
pass
username2
pass2
username3
pass3

我想删除一个特定的用户,例如:

./deleteftpuser username2

并拥有像

这样的文件
username
pass
username3
pass3

我认为我应该使用 sed 命令,但我不知道应该如何使用它。

非常感谢您的帮助!

【问题讨论】:

    标签: string bash file unix sed


    【解决方案1】:

    使用 GNU sed:

    sed '/username2/ {N; d}' file.txt
    

    awk:

    awk '/username2/ {np=1; next}; !np {print} np {np=0}' file.txt
    

    示例:

    % cat file.txt 
    username
    pass
    username2
    pass2
    username3
    pass3
    
    % sed '/username2/ {N; d}' file.txt
    username
    pass
    username3
    pass3
    
    % awk '/username2/ {np=1; next}; !np {print} np {np=0}' file.txt 
    username
    pass
    username3
    pass3
    

    【讨论】:

    • 你为什么要/.*//username2/{N;d} 就足够了。
    • @123 绝对不知道我在想什么:/
    • awk 解决方案可以简写为awk '/username2/ || f{ f=!f; next } {print}'
    • 除了我想要 -i arg 而不是 -E,这是完美的解决方案,非常感谢 :)
    【解决方案2】:
    sed -e '/username2/ { N; d; }' infile
    username
    pass
    username3
    pass3
    

    【讨论】:

    • 虽然这段代码可能有助于解决问题,但它并没有解释为什么和/或如何回答问题。提供这种额外的背景将显着提高其长期教育价值。请edit您的答案添加解释,包括适用的限制和假设。
    【解决方案3】:

    使用 GNU sed

    $ cat ip.txt 
    username
    pass
    username2
    pass2
    username3
    pass3
    
    $ sed '/username2/,+1d' ip.txt 
    username
    pass
    username3
    pass3
    

    这会搜索匹配username2 的行,然后删除该行加上后面的一行。改成+2后删除两行以此类推

    perl 的通用解决方案

    $ perl -ne 'if(/username2/){ $l = <> foreach(1..1) } else{ print }' ip.txt 
    username
    pass
    username3
    pass3
    
    $ perl -ne 'if(/username2/){ $l = <> foreach(1..2) } else{ print }' ip.txt 
    username
    pass
    pass3
    
    $ # can also use: perl -pe 'if(/username2/){ undef $_; <> foreach(1..2) }' ip.txt 
    
    • 如果行与给定模式匹配,则根据需要获取其后的行。
    • 否则,打印输入行

    【讨论】:

      【解决方案4】:

      Grep 解决方案-

      $cat file
      
       username
       pass
       username2
       pass2
       username3
       pass3
      
      grep -A 1 "username2" file > temp
      grep -vf temp file
      

      将搜索字符串及其后的一行存储在文件temp 中。 然后从文件中获取其他所有内容。

      输出-

      username
      pass
      username3
      pass3
      

      【讨论】:

        【解决方案5】:

        又一个 awk 解决方案。 p 仅在 $0pusername2next 时才会设置:

        $ awk '($0=="username2" || p=="username2") && p=$0 {next} 1' file
        username
        pass
        username3
        pass3
        

        【讨论】:

          猜你喜欢
          • 2020-10-08
          • 2020-10-14
          • 2019-03-27
          • 2014-05-16
          • 2019-11-08
          • 2016-04-10
          • 2016-04-03
          • 2010-10-04
          • 2017-12-04
          相关资源
          最近更新 更多