Como verificar se a cadeia começa com o valor que contém #, tab e talvez space?

2

No meu script bash , desejo verificar se uma sequência começa com # modified: ou # new file: . Em ambos os casos, o caractere após # é uma tabulação. No último caso, o caractere entre "novo" e "arquivo" é um espaço.

Eu tentei:

if [[ $outline == "#\tmodified:*" ]]; then

e

if [[ $outline == "# modified:*" ]]; then (clique na guia real depois de #)

Mas nem funcionou. Como faço isso?

    
por amphibient 05.02.2014 / 00:26

2 respostas

5

Com qualquer shell POSIX:

tab=$(printf '\t') # or tab='   ' # (a real tab character)
case $outline in
  ("#${tab}modified:"*) ...
esac

Com ksh93 , zsh ou bash :

case $outline in
  ($'#\tmodified:'*) ...
esac

ou:

if [[ $outline = $'#\tmodified:'* ]]; then...

A chave é:

  • * não deve ser citado, caso contrário, é usado literalmente.
  • \t só é expandido no tipo de cota $'...' (ou por printf no argumento format)
por 05.02.2014 / 00:32
1

Você pode usar o operador de correspondência de cadeia regex bash =~ :

outline="#  modified: Jan 10 2015" # or
outline="#  new file: hello.sh"
if [[ $outline =~ ^#\   (modified|new file): ]]; then
    echo match
else
    echo no match
fi

Observe que os espaços em branco antes de modified instâncias no código e o espaço em branco antes de new file são guias. o espaço em branco dentro de new file é um espaço regular.

(Editado para combinar com um dos dois formatos.)

    
por 05.02.2014 / 00:34