Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash中由特殊字符组成的行的拷贝数_Bash - Fatal编程技术网

bash中由特殊字符组成的行的拷贝数

bash中由特殊字符组成的行的拷贝数,bash,Bash,我有一个练习,我有一个文件,在开始的时候,我有类似的东西 #!usr/bin/bash # tototata #tititutu #ttta Hello world Hi Test test #zabdazj #this is it 我必须从一个#开始,直到我没有的那一行,然后把它存储在一个变量中。在shebang的情况下,它必须跳过它,如果行之间有空格,它也必须跳过它们。我们只想在谢邦和下一个角色之间发表评论。 我是bash的新手,我想知道是否有办法做到这一点 预期产出: # tot

我有一个练习,我有一个文件,在开始的时候,我有类似的东西

#!usr/bin/bash



# tototata
#tititutu
#ttta

Hello world
Hi
Test test
#zabdazj
#this is it
我必须从一个
#
开始,直到我没有的那一行,然后把它存储在一个变量中。在shebang的情况下,它必须跳过它,如果行之间有空格,它也必须跳过它们。我们只想在谢邦和下一个角色之间发表评论。 我是bash的新手,我想知道是否有办法做到这一点

预期产出:

# tototata
#tititutu
#ttta

试着用这种简单的方法来更好地理解

#!/bin/bash

sed 1d your_input_file | while read line; 
do
    check=$( echo $line | grep ^"[#;]" )

    if ([ ! -z "$check" ] || [ -z "$line" ])
    then
            echo $line;
    else
            exit 1;
    fi
done

这可能更正确,尽管您的问题不清楚输入文件是否有脚本shebang,是否必须跳过shebang以匹配示例输出,或者输入文件shebang是否只是伪造的

如果输入文件的第一行不是以
#
开头,那么该怎么办也不清楚

你真的应该把作业的内容作为参考

无论如何,这里有一个脚本,它确实收集了第一组连续的行,这些行从一个sharp
#
开始,进入
arr
数组变量

它可能不是你作业的精确解决方案(你应该能够用上一节课教你的内容来解决这个问题),但它会给你一些线索和关键,让你反复阅读文件中的行,并测试这些行是否以
.
开头

#/usr/bin/env bash
#我们的变量用于存储解析的行
#是一个字符串数组,每行有一个条目
声明-a arr=()
#迭代读取文件中的行
#当它与正则表达式匹配时:^[#]
#当线条以一个尖锐的符号开始时#
而IFS=$'\n'读取-r行&[“$line”=~^[#]];做
#将行添加到arr数组变量
arr+=(“$line”)
完成这个如何(未测试,因此您可能需要对其进行一点调试,但我在代码中的注释应该解释发生了什么):

读取行时
做
#第一行的首字母是1,其后是0。当脚本开始时,
#变量未定义。
:${initial:=1}
#测试以#开头的行。需要引用散列
#这样就不会被当作评论了。
如果[[$line='#'*]]
然后
#测试初始值#!
如果((首字母==1))&&[$line=='#!'*]]
然后
:#忽略它
其他的
echo$line#或者用它做任何你想做的事情
fi
fi
#停止在非空白、非注释行
如果[[$line!=*[^\]*]]
然后
打破
fi
initial=0#下一行不是初始行
完成你的文件

提供最小的输入、预期的输出以及您为解决问题所做的尝试problem@Thomas_Vcheck:但在您的情况下,预期的输出应该是#!行,因为它以一个
#
开头,而下面的行不是@Thomas_Vcheck:还不清楚您将如何处理这些注释行,
不会出现在第一列中,而是在一些空格之后。现在,DamianK和me的解决方案将这些线路视为停止条件;只需将文件导入while循环即可。另外,不需要创建运行
echo | grep
管道的子进程。您可以直接在bash中检查变量的内容。如何在文件的第2行开始解析?@Thomas_Vcheck我修改了我的示例。现在是从第二行开始,当有空行时不会停止。@DamianK:您的更改实现了OP在评论中要求的更改,但不是他在问题中所做的更改,现在的更改是:如果是shebang,则必须跳过。如果脚本没有sheebang行(这对于sh脚本来说是完全合法的),但以注释行开头,则此注释行将被您的代码删除。@user1934428您是对的,再次:)我只是尝试帮助,回答特定问题,而不是创建完整的解决方案。我们不知道这个文件最终会是什么样子。在我看来,这在这个脚本级别上并不重要。@Thomas_Vcheck:如果您在重要点上编辑问题(不仅仅是修复语言语法中的错误),请确保我们可以看到,哪些部分已被更改/添加。
while read line
do
  # initial is 1 one the first line, and 0 after this. When the script starts,
  # the variable is undefined.
  : ${initial:=1}
  # Test for lines starting with #. Need to quote the hash
  # so that it is not taken as comment.
  if [[ $line == '#'* ]]
  then
    # Test for initial #!
    if (( initial == 1 )) && [[ $line == '#!'* ]]
    then
      : # ignore it
    else
      echo $line # or do whatever you want to do with it
    fi
  fi
  # stop on non-blank, non-comment line   
  if [[ $line != *[^\ ]* ]]
  then
    break
  fi
  initial=0 # Next line won't be an initial line
done < your_file