Скопировать номер строки, составленной специальным символом в bash - PullRequest
1 голос
/ 09 января 2020

У меня есть упражнение, в котором у меня есть файл, и в начале его у меня есть что-то вроде

#!usr/bin/bash



# tototata
#tititutu
#ttta

Hello world
Hi
Test test
#zabdazj
#this is it

И я должен брать каждую первую строку, начинающуюся с #, до строки, где я не иметь его и хранить в переменной. В случае shebang, он должен пропустить его, и если между строками есть пробел, он должен пропустить их тоже. Мы просто хотим комментарий между Шебангом и следующим персонажем. Я новичок в bash, и я хотел бы знать, если есть способ сделать это, пожалуйста?

Ожидаемый результат:

# tototata
#tititutu
#ttta

Ответы [ 3 ]

2 голосов
/ 09 января 2020

Попробуйте таким простым способом лучше понять.

#!/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
0 голосов
/ 09 января 2020

Как насчет этого (не проверено, поэтому вам, возможно, придется немного его отладить, но мои комментарии в коде должны объяснить, что происходит):

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
0 голосов
/ 09 января 2020

Это может быть более правильно, хотя ваш вопрос был неясен относительно погоды, во входном файле был сценарий shebang, нужно ли было пропускать shebang, чтобы соответствовать вашему примеру вывода, или если входной файл shebang был просто фиктивным.

Также непонятно, что делать, если первые строки входного файла не начинаются с #.

Вы действительно должны опубликовать текст своего задания в качестве ссылки.

В любом случае, вот скрипт, который собирает первый набор последовательных строк, начинающихся с резкого #, в переменную массива arr.

Возможно, это не точное решение вашего назначения (ведь вам следует в состоянии решить то, чему вас научили предыдущие уроки), но даст вам некоторые подсказки и ключи для итерации строк чтения из файла и проверки того, что строки начинаются с #.

#!/usr/bin/env bash

# Our variable to store parsed lines
# Is an array of strings with an entry per line
declare -a arr=()

# Iterate reading lines from the file
# while it matches Regex: ^[#]
# mean while lines starts with a sharp #
while IFS=$'\n' read -r line && [[ "$line" =~ ^[#] ]]; do
  # Add line to the arr array variable
  arr+=("$line")
done <a.txt

# Print each array entries with a newline
printf '%s\n' "${arr[@]}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...