test.txt 파일의 내용은 다음과 같습니다.
ls -a
cmake --verbose
verbose
grep
이 파일을 보고 "--"로 시작하는 단어(예: "--verbose")만 찾고 싶습니다.
그러나 다음 패턴을 매개변수로 사용하면 grep
작동하지 않습니다.
$ cat testing.txt | grep --
Usage: grep [OPTION]... PATTERN
[FILE]... Try 'grep --help' for more information.
$ cat testing.txt | grep -
ls -a
cmake --verbose
$ cat testing.txt | grep '--v'
grep (GNU grep) 3.1
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
$ cat testing.txt | grep ver
cmake --verbose
verbose
$ cat testing.txt | grep '-ver'
ls -a
grep
a로 시작하는 모든 매개변수가--
옵션이라고 생각하시나요? grep이 "--"로 시작하는 패턴(파일에서)을 검색할 수 있도록 이 문제를 방지하려면 어떻게 해야 합니까?- 마지막 시도는 "-ver" 패턴을 사용하여 이루어졌으므로
grep
해당 패턴은 옵션으로 간주되지 않았지만grep
"-ver" 패턴이 포함되어 있음에도 불구하고 파일의 "--verbose" 단어와 일치하지 않았습니다. 이 동작의 원인은 무엇입니까?
답변1
이 문자열은 --
명령줄에 나타날 때 대부분의 유틸리티에 특별합니다. 그것은 신호를 보낸다옵션 끝명령줄 인수 파서에. 예를 들어 현재 디렉터리에서 호출된 파일을 rm -- -f
삭제하기 위해 대시로 시작하는 파일 이름을 전달하려는 경우에 사용됩니다 .-f
--
패턴으로 사용하려면 grep
유틸리티에 패턴임을 명시적으로 알려주세요.
grep -e --
옵션은 검색하려는 패턴 -e
인 옵션 인수를 허용합니다 .grep
grep
당신은 또한 사용할 수 있습니다
grep -- --
여기서 grep
두 번째는 첫 번째가 옵션이 될 수 없다고 --
해서 모드라고 알려졌습니다.--
ls -a
파일의 행에 가 포함되어 있지 않기 때문에 마지막 파이프가 반환됩니다 r
. 이 명령은 " ( ) 와 일치하지 않는 모든 행 추출 " grep -ver
로 작성할 수도 있습니다 .grep -v -e r
-v
r
-e r
답변2
제목의 질문에 답하려면(일부 정규식 엔진에서는 영숫자 또는 밑줄로 시작하지 않는 공백으로 구분된 단어 보고 ) PCRE를 사용하여 빌드를 지원하는 경우 \w
GNU로 수행할 수 있습니다. grep
:
grep -Po '(?<!\S)[^\w\s]\S*'
^
이는 공백 이 아닌 문자( )가 앞에( ) 없고 공백이 아닌 문자( )가 뒤에 오지 않는 경우( ) 단어 1( ) 또는 공백 문자( ) \w
이외의 문자( ) 입니다 .\s
(?<!...)
\S
*
\S
입력한 내용은 다음과 같이 반환됩니다.
-a
--verbose
답변3
이 문제는 다음과 같이 해결할 수 있습니다 GNU grep
.positive lookarounds
$ grep -oP '(?:(?!\h)\W)+\w+' inp
그것을 읽으면서 문자열의 내 위치에서 단어가 아닌 단어가 뒤따르는 것을 봅니다. 그러나 이 비단어는 공백을 제외합니다.
산출:
-a
--verbose