【问题标题】:Bash script to echo certain lines from file用于回显文件中某些行的 Bash 脚本
【发布时间】:2013-12-05 13:59:15
【问题描述】:

我有一个看起来像这样的大文件:

line1
line2
line3;

line5
line6;
line7

line9
line10;

基本上,它是一堆行,其中一些以分号结尾。在这些带分号的行后面可能有也可能没有空行。

我想用这个文件做一些看起来相对简单的事情,但我还没有想出一个方法来做到这一点。我想调用一个 bash 脚本来识别那些以分号结尾的行,并在每行之后回显第一个非空行。

因此,在上面的示例中,输出将是:

line5
line7

我尝试了几种不同的方法,包括遍历整个文件,使用正则表达式检查当前行是否以分号结尾,以及切换布尔变量以确定是否应回显下一个非空行。但我没有运气。

似乎应该有更简单的方法,也许使用 grep,但我似乎无法想出它。关于实现这一点的好方法有什么想法吗?

【问题讨论】:

  • 会不会有连续两行以';'结尾你需要';'之后的第一个非空行还是第一个不以';'结尾的非空行?
  • 好问题。可能有两个以“;”结尾的连续行。如果是这种情况,我会想要第二行。所以我正在寻找';'之后的第一个非空行,无论它是否有';'与否。

标签: bash


【解决方案1】:

Awk 非常适合这种事情。

$ cat data
line1
line2
line3;

line5
line6;
line7

line9
line10;
$ awk '/;$/{print_next=1; next} (/^[^ ].*$/ && print_next) {print; print_next=0}' < data
line5
line7

【讨论】:

    【解决方案2】:

    试试这个命令:

    sed '/^$/d' file | sed -n '/;/{n;p}'
    
    • 删除空行
    • 打印下面的行;

    【讨论】:

      【解决方案3】:

      如果您只需要“grep”解决方案

      grep -v "^$" file | grep -A1 ";" | grep -v ";\|--"
      

      【讨论】:

        【解决方案4】:

        尝试“sed -e '/;$/d' test.txt”命令,它的工作原理。

         # cat test.txt 
         line1
         line2
         line3;
        
         line5
         line6;
         line7
        
         line9
         line10;
        
        
         # sed -e '/;$/d' test.txt > lines.txt
        
         # cat lines.txt 
         line1
         line2
        
         line5
         line7
        
         line9
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-04
          • 2014-07-25
          • 2021-08-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-04
          相关资源
          最近更新 更多