이상한 zsh grep -P 동작

이상한 zsh grep -P 동작

PuTTY를 사용하여 Windows에서 서버에 연결합니다.

나는 오랫동안 로컬 관리 구성을 건드리지 않은 것 같습니다.

$ 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
...

not으로 시작하는 줄이 있는지 확인하고 싶습니다 #.

$ 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

두 번째와 세 번째 출력이 동일하고 비어 있는 이유와 네 번째 출력이 무엇인지 설명할 수 있는 사람이 있나요?

UPD: 여기에 있는 파일은 다음과 같습니다.

### 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

답변1

큰따옴표 안의 문자는 $"\`여전히 특별합니다. 작은 따옴표와 혼동할 수 있습니다. 작은 따옴표 안에 있는 모든 문자는 '문자열 리터럴로 끝나는 문자를 제외하고 문자 그대로 해석됩니다.

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

$[…]$((…))POSIX 쉘에서와 같이 작성할 수 있는 산술 표현식에 대한 더 이상 사용되지 않는 구문입니다 . ^#유효한 산술 표현식이 아닙니다. 쉘은 숫자 또는 변수 이름과 같은 피연산자를 기대합니다.

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

파이프의 두 번째 명령은 모든 출력을 소비하기 전에 중단되므로 cat(아직 읽기도 시작하지 않았음) 첫 번째 명령( cat)은 다음을 받습니다.신호 파이프라인.

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

백슬래시는 쉘이 다음 문자를 문자 그대로 해석하도록 지시하므로 패턴 이 grep표시됩니다 . 이러한 모드는 각각 "문자 이외의 문자가 오는 줄 끝 " 및 "뒤에 오는 줄 끝"을 의미합니다. 이러한 패턴 중 어느 것도 일치하지 않습니다.$[^#]$###

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

$#$1위치 인수( , $2, ..., 집합적으로 $@), 즉 셸 명령줄에서 전달되거나 함수 내부의 경우 함수에 전달된 인수의 수입니다 . 대화형 셸에는 일반적으로 위치 인수가 없으므로 grep패턴이 표시됩니다 0.

찾고 있는 패턴은 ^[^#]( ^줄의 시작과 일치)입니다. 패턴에 쉘 변수 값이나 명령 출력을 포함하려는 경우가 아니면 작은따옴표를 사용하십시오(여기서는 중요하지 않지만 일부 패턴, 특히 백슬래시 또는 가 포함된 패턴의 경우에 해당됩니다 $). 이 패턴은 기본 정규식(일반), 확장 정규식() 및 Perl 정규식() -P에서 동일한 방식으로 작성되므로 그럴 필요가 없습니다.grepgrep -Egrep -P

$ </opt/jira/.subversion/config grep '^[^#]'

답변2

각 경우에 얻는 결과가 어떻게 되는지 정확히 말할 수는 없습니다. 그러나 수행 중인 작업에는 두 가지 문제가 있습니다.

  1. -P플래그(Perl 호환 정규 표현식용)는 실험적인 것으로 간주되며 수행하려는 작업에 필요하지 않습니다.

  2. $정규식의 줄 끝 문자입니다. 줄 시작 문자를 사용해야 합니다 ^.


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

아니면 좀 더 간략하게 말하자면,

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

당신이 원하는 것을해야합니다.

관련 정보