Teste da shell para encontrar um padrão em uma string

7

Eu só queria perguntar se existe algum comando que funcione em shells comuns (bash, dash, kornshell)? Deverá verificar se a variável line contém qualquer parte do caminho.

if [[ $line =~ "$PWD"$ ]] ;then
    
por applenic 27.03.2015 / 13:52

2 respostas

4

Sim, versões recentes do bash podem fazer isso:

$ pwd
/home/terdon
$ line="I'm in /home/terdon"
$ [[ "$line" =~ "$PWD"$ ]] && echo yes
yes

A mesma sintaxe funciona em zsh e ksh, mas não em traço. Tanto quanto eu sei, traço não tem tais capacidades.

Observe que sua regex está verificando se a variável $line termina com $PWD . Para verificar se $PWD corresponde a qualquer lugar em $line , remova o $ :

$ line="I'm in /home/terdon, are you?"
$ [[ "$line" =~ "$PWD" ]] && echo yes
yes
    
por 27.03.2015 / 13:57
9

Em qualquer shell compatível com POSIX, você pode fazer:

case $line in (*"$PWD"*)
#    whatever your then block had
;;esac

Isso funciona em bash , dash e praticamente qualquer outro shell que você possa nomear.

Ele também pode ser usado para lidar com várias possibilidades facilmente. Por exemplo:

case $line in 
(*"$PWD"*)
    echo \$PWD match\!
;;
(*"$OLDPWD"*)
    echo \$OLDPWD match\!
;;
(*)
    ! echo no match\!
;;esac

Você também pode usar a alternância:

case $line in (*"$PWD"*|*"$OLDPWD"*)
    echo '$OLDPWD|$PWD match!'
;;esac

Observe o uso da citação acima:

  1. %código%
    • O objeto de uma instrução case $line ... não será dividido em case ou será usado como um padrão para nome de arquivo gen. Isso é semelhante à maneira como o argumento à esquerda em um teste $IFS é tratado.
  2. %código%
    • Aqui também uma expansão de shell não está sujeita a [[ ou geração de nome de arquivo - uma expansão sem aspas não será dividida nem glob.
    • Mas uma expansão sem aspas aqui pode ser interpretada como um padrão em vez de uma sequência literal, e, portanto, uma expansão pode significar mais de uma coisa, dependendo se ela é citada ou não.
    • É importante citar qualquer variável usada em um padrão que deva ser interpretado literalmente, da mesma forma que você poderia citar literalmente caracteres de padrão que você queria interpretar.
    • Por exemplo, se (*"$PWD"*) continha um $IFS e não fosse citado, ele seria interpretado como um objeto padrão e não como um literal $PWD a ser pesquisado.
por 28.03.2015 / 00:09