BASH-如何从#SOF到#EOF从文件中检索行

BASH-如何从#SOF到#EOF从文件中检索行,bash,awk,Bash,Awk,如何从#SOF到#EOF从文件中检索行 我需要3个文件 in target_1.sh "Lorem ipsum dolor sit amet" "Vivamus pretium enim" "Est accumsan enim magnis" in target_2.sh "Eleifend tincidunt id justo" "Tellus ut tincidunt vel ac a orci" "Sapien Nullam Sed nunc" "Vestibulum est accum

如何从#SOF到#EOF从文件中检索行

我需要3个文件

in target_1.sh
"Lorem ipsum dolor sit amet"
"Vivamus pretium enim"
"Est accumsan enim magnis"

in target_2.sh
"Eleifend tincidunt id justo"
"Tellus ut tincidunt vel ac a orci"
"Sapien Nullam Sed nunc"
"Vestibulum est accumsan enim"

in target_3.sh
"Consequat mauris mollis montes"
告诉某人怎么做?感谢您的帮助

您可以通过以下方式完成:

输入/输出:

  • 匹配问题中显示的示例
说明:

  • awk'…'
    :调用awk,一种逐行操作文本文件的工具。单引号集所包含的说明将提供给awk
  • /^#EOF$/{do_print=0}
    ^
    是“行开始”的正则表达式锚,而
    $
    是“行结束”的锚。这里我们要说的是,如果我们将
    #EOF
    视为行上的唯一内容,请关闭打印标志
    do#u print
  • do_uprint{print>(“target_u“f_index.sh”)}
    :这将对awk解析的每一行运行。如果设置了
    do_print
    标志,则使用
    f_index
    指定的索引将该行附加到输出文件中
  • /^ SOF$/{do_print=1;f_index++}
    :同样,如果我们在一行上只看到
    #SOF
    ,请打开打印标志,并将
    f_index
    增加1
  • 请注意,每行都会计算最后3项,这就是为什么我们首先查找EOF,然后打印行(如果适用),然后再查找SOF-我们不想打印
    #EOF
    #SOF
  • source.sh
    :指定要
    awk
    的输入文件的名称;救一只猫
    • 将优雅地完成:

      awk '
          /^#EOF/{l=0}
          l {
              print > "target_" file ".sh"
          }
          /^#SOF/{l=1;file++}
      ' source.sh
      
      处理后

      $ ls -1t target_*
      target_1.sh
      target_2.sh
      targer_3.sh
      
      解释

      • l{}
        if(l==1){}
        相同,因为
        1
        awk
      如果您只想使用(您仅有的一个标签),请尝试执行以下操作:

      #!/bin/bash
      c=0
      while read a; do
          if [[ $a =~ ^#SOF ]]; then
              l=1
              ((file++))
          fi
      
          [[ $a =~ ^#EOF ]] && l=0
      
          if [[ ! $a =~ ^#SOF ]] && ((l==1)); then
              echo $a >> "target_${file}.sh"
          fi
      done < input_file
      
      #/bin/bash
      c=0
      边读边读;做
      如果[$a=~^#SOF]];然后
      l=1
      ((文件++))
      fi
      [$a=~^#EOF]&&l=0
      如果[!$a=~^#SOF]&&((l==1));然后
      echo$a>>“target_${file}.sh”
      fi
      完成
      您不需要
      &&/^#SOF/
      如果你把
      /^#SOF/
      放在打印块后面,那就把它分出来。我已经对这个答案投了赞成票。我更喜欢编辑过的版本。@glennjackman你们这些家伙教了我很多新东西;我慢慢地一点一点地把它们捡起来;)
      $ ls -1t target_*
      target_1.sh
      target_2.sh
      targer_3.sh
      
      #!/bin/bash
      c=0
      while read a; do
          if [[ $a =~ ^#SOF ]]; then
              l=1
              ((file++))
          fi
      
          [[ $a =~ ^#EOF ]] && l=0
      
          if [[ ! $a =~ ^#SOF ]] && ((l==1)); then
              echo $a >> "target_${file}.sh"
          fi
      done < input_file