Weird zsh grep -P comportamento

1

Eu conecto ao servidor com o PuTTY do Windows.

Eu tenho um longo ainda não tocado (suponho) por mãos de configuração de administrador local:

$ cat /opt/jira/.subversion/config
...    
### must be enabled, which is typically done by setting the
### 'enable-auto-props' option.
# *.c = svn:eol-style=native
# *.cpp = svn:eol-style=native
...

Quer ver se há linhas, que começam com algo que não é # :

$ cat /opt/jira/.subversion/config | grep -P "$[^#]"
zsh: bad math expression: operand expected at '^#'
$
[1]    broken pipe  cat /opt/jira/.subversion/config

$ cat /opt/jira/.subversion/config | grep -P "\$[^#]"

$ cat /opt/jira/.subversion/config | grep -P "\$#"

$ cat /opt/jira/.subversion/config | grep -P "$#"
### details, see Debian Bug #413102):
# global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo

Alguém pode explicar por que a segunda e a terceira saída estão vazias e qual é a quarta?

UPD: o arquivo aqui é:

### This file configures various client-side behaviors.
###
### The commented-out examples below are intended to demonstrate
### how to use this file.

### Section for authentication and authorization customizations.
[auth]
### Set store-passwords to 'no' to avoid storing passwords in the
### auth/ area of your config directory.  It defaults to 'yes'.
### Note that this option only prevents saving of *new* passwords;
### it doesn't invalidate existing passwords.  (To do that, remove
### the cache files by hand as described in the Subversion book.)
# store-passwords = no
### Set store-auth-creds to 'no' to avoid storing any subversion
### credentials in the auth/ area of your config directory.
### It defaults to 'yes'.  Note that this option only prevents
### saving of *new* credentials;  it doesn't invalidate existing
### caches.  (To do that, remove the cache files by hand.)
# store-auth-creds = no

### Section for configuring external helper applications.
[helpers]
### Set editor to the command used to invoke your text editor.
###   This will override the environment variables that Subversion
###   examines by default to find this information ($EDITOR,
###   et al).
# editor-cmd = editor (vi, emacs, notepad, etc.)
### Set diff-cmd to the absolute path of your 'diff' program.
###   This will override the compile-time default, which is to use
###   Subversion's internal diff implementation.
# diff-cmd = diff_program (diff, gdiff, etc.)
### Set diff3-cmd to the absolute path of your 'diff3' program.
###   This will override the compile-time default, which is to use
###   Subversion's internal diff3 implementation.
# diff3-cmd = diff3_program (diff3, gdiff3, etc.)
### Set diff3-has-program-arg to 'true' or 'yes' if your 'diff3'
###   program accepts the '--diff-program' option.
# diff3-has-program-arg = [true | false]
### Set merge-tool-cmd to the command used to invoke your external
### merging tool of choice. Subversion will pass 4 arguments to
### the specified command: base theirs mine merged
# merge-tool-cmd = merge_command

### Section for configuring tunnel agents.
[tunnels]
### Configure svn protocol tunnel schemes here.  By default, only
### the 'ssh' scheme is defined.  You can define other schemes to
### be used with 'svn+scheme://hostname/path' URLs.  A scheme
### definition is simply a command, optionally prefixed by an
### environment variable name which can override the command if it
### is defined.  The command (or environment variable) may contain
### arguments, using standard shell quoting for arguments with
### spaces.  The command will be invoked as:
###   <command> <hostname> svnserve -t
### (If the URL includes a username, then the hostname will be
### passed to the tunnel agent as <user>@<hostname>.)  Here we
### redefine the built-in 'ssh' scheme to avoid an unfortunate
### interaction with the "ControlMaster auto" feature (for
### details, see Debian Bug #413102):
ssh = $SVN_SSH ssh -o ControlMaster=no
### If you wanted to define a new 'rsh' scheme, to be used with
### 'svn+rsh:' URLs, you could do so as follows:
# rsh = rsh
### Or, if you wanted to specify a full path and arguments:
# rsh = /path/to/rsh -l myusername
### On Windows, if you are specifying a full path to a command,
### use a forward slash (/) or a paired backslash (\) as the
### path separator.  A single backslash will be treated as an
### escape for the following character.

### Section for configuring miscelleneous Subversion options.
[miscellany]
### Set global-ignores to a set of whitespace-delimited globs
### which Subversion will ignore in its 'status' output, and
### while importing or adding files and directories.
### '*' matches leading dots, e.g. '*.rej' matches '.foo.rej'.
# global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo
#   *.rej *~ #*# .#* .*.swp .DS_Store
### Set log-encoding to the default encoding for log messages
# log-encoding = latin1
### Set use-commit-times to make checkout/update/switch/revert
### put last-committed timestamps on every file touched.
# use-commit-times = yes
### Set no-unlock to prevent 'svn commit' from automatically
### releasing locks on files.
# no-unlock = yes
### Set mime-types-file to a MIME type registry file, used to
### provide hints to Subversion's MIME type auto-detection
### algorithm.
# mime-types-file = /path/to/mime.types
### Set preserved-conflict-file-exts to a whitespace-delimited
### list of patterns matching file extensions which should be
### preserved in generated conflict file names.  By default,
### conflict files use custom extensions.
# preserved-conflict-file-exts = doc ppt xls od?
### Set enable-auto-props to 'yes' to enable automatic properties
### for 'svn add' and 'svn import', it defaults to 'no'.
### Automatic properties are defined in the section 'auto-props'.
# enable-auto-props = yes
### Set interactive-conflicts to 'no' to disable interactive
### conflict resolution prompting.  It defaults to 'yes'.
# interactive-conflicts = no

### Section for configuring automatic properties.
[auto-props]
### The format of the entries is:
###   file-name-pattern = propname[=value][;propname[=value]...]
### The file-name-pattern can contain wildcards (such as '*' and
### '?').  All entries which match (case-insensitively) will be
### applied to the file.  Note that auto-props functionality
### must be enabled, which is typically done by setting the
### 'enable-auto-props' option.
# *.c = svn:eol-style=native
# *.cpp = svn:eol-style=native
# *.h = svn:eol-style=native
# *.dsp = svn:eol-style=CRLF
# *.dsw = svn:eol-style=CRLF
# *.sh = svn:eol-style=native;svn:executable
# *.txt = svn:eol-style=native
# *.png = svn:mime-type=image/png
# *.jpg = svn:mime-type=image/jpeg
# Makefile = svn:eol-style=native
    
por Nakilon 12.05.2012 / 08:29

2 respostas

5

Dentro de aspas duplas, os caracteres $"\' permanecem especiais. Você pode estar confundindo-as com aspas simples: dentro de aspas simples, todos os caracteres são interpretados literalmente, exceto por ' em si, que termina com a string literal.

$ cat /opt/jira/.subversion/config | grep -P "$[^#]"
zsh: bad math expression: operand expected at '^#'

$[…] é uma sintaxe obsoleta para expressões aritméticas, que pode ser escrita $((…)) como em shells POSIX. ^# não é uma expressão aritmética válida; o shell esperava um operando, como um número ou um nome de variável.

[1]    broken pipe  cat /opt/jira/.subversion/config

Como o segundo comando no pipeline foi interrompido antes de consumir toda a saída de cat (ele nem começou a ler), o primeiro comando ( cat ) recebeu um SIGPIPE .

$ cat /opt/jira/.subversion/config | grep -P "\$[^#]"
$ cat /opt/jira/.subversion/config | grep -P "\$#"

A barra invertida diz ao shell para interpretar o próximo caractere literalmente, então grep viu o padrão $[^#] ou $# . Estes padrões significam “o fim da linha seguido por qualquer caractere exceto # ” e “o final da linha seguido por # ” respectivamente. Nenhum desses padrões pode corresponder a qualquer coisa.

$ cat /opt/jira/.subversion/config | grep -P "$#"

$# é o número de argumentos posicionais ( $1 , $2 ,…, acessível coletivamente como $@ ), ou seja, os argumentos passados na linha de comando do shell ou os argumentos para uma função se dentro de um função. Em um shell interativo, geralmente não há argumentos posicionais, portanto, grep viu o padrão 0 .

O padrão que você está procurando é ^[^#] ( ^ corresponde no início de uma linha). A menos que você queira incluir o valor de uma variável shell ou a saída de um comando no padrão, use aspas simples (não importa aqui, mas é importante para alguns padrões, especialmente aqueles que contêm uma barra invertida ou um $ ). Você não precisa de -P , pois esse padrão é escrito da mesma forma em expressões regulares básicas (% normalgrep), expressões regulares extensas ( grep -E ) e expressões regulares perl ( grep -P ).

$ </opt/jira/.subversion/config grep '^[^#]'
    
por 13.05.2012 / 02:30
2

Eu não posso dizer exatamente o que acontece para dar a saída que você obteve em cada caso. No entanto, existem dois problemas com o que você está fazendo:

  1. A -P flag (para expressões regulares compatíveis com Perl) é considerada experimental e não é necessária para o que você está tentando fazer.

  2. $ é o caractere de fim de linha em uma expressão regular. Você deve usar o caractere de início de linha, ^ .

cat /opt/jira/.subversion/config | grep "^[^#]"

ou mais concisa,

grep "^[^#]" /opt/jira/.subverison/config

deve fazer o que quiser.

    
por 12.05.2012 / 09:14