【问题标题】:Bash script to remove all lines in a text file untill a stringBash脚本删除文本文件中的所有行,直到字符串
【发布时间】:2011-01-08 14:36:24
【问题描述】:

我有一个包含很多字的文件,例如:

one
two
three
four
tree
house
cat
dog
etc

我想删除“house”之前的所有单词,以便仅获取:

cat
dog
etc

【问题讨论】:

    标签: bash shell unix scripting filter


    【解决方案1】:
    sed -n '0,/^house$/d;p' input.txt
    

    【讨论】:

    • 这个为我打印出整个文件。 (在 OS X 10.6.6 上运行 sed)
    • GNU sed 支持 0 作为地址,但其他不支持。 0,/regex/1,/regex/ 的区别在于,如果正则表达式匹配第一行,0 形式将结束范围,而 1 形式将等到正则表达式的下一次匹配结束范围。
    • 这与:sed '0,/^house$/d' input.txt 有何不同?也就是说,为什么-n;p
    【解决方案2】:

    您可以使用 Perl 单行代码轻松完成此操作,当然您也可以将其合并到 bash 脚本中。

    $ perl -ne 'print if $ok; $ok=1 if /^house$/' sample.txt 
    cat
    dog
    etc
    

    【讨论】:

      【解决方案3】:
      awk '
          BEGIN                  { noprint = 1; cue = ARGV[1]; ARGV[1] = ""}
          (!noprint)             { print }
          (noprint && $0 == cue) { noprint = 0 }
      ' house textfile
      

      【讨论】:

      • 嘿,-1 是怎么回事?这适用于 Debian 5.0 上的 gawk 3.1.5。
      • 如果我删除提示和文件名之间的
      【解决方案4】:

      您也可以使用 Unix 文本编辑器来完成此类任务。请注意,ed 会将整个文件读入内存并在没有先前备份的情况下就地编辑文件。

      # prints result to stdout
      printf '%s\n' H ',g/^house$/1,/^house$/d' ',p' | ed -s file
      printf '%s\n' H ',g/^house$/1,//d' ',p' | ed -s file  # short version
      
      # edits file in-place
      printf '%s\n' H ',g/^house$/1,/^house$/d' wq | ed -s file
      

      更多关于ed的信息请看:

      "使用 ed 文本编辑器从脚本编辑文件",

      http://wiki.bash-hackers.org/howto/edit-ed

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        • 2021-06-25
        • 1970-01-01
        • 2013-05-18
        相关资源
        最近更新 更多