줄 시작 부분에 grep 고정 문자열

줄 시작 부분에 grep 고정 문자열

grep "^$1"일종의 작업이지만 "$1"grep이 해당 문자를 구체적으로 해석하지 않도록 이스케이프하려면 어떻게 해야 합니까?

아니면 더 좋은 방법이 있나요?

편집하다: 검색하고 싶지는 않지만 '^$1'줄의 시작 부분에 있는 경우에만 일치해야 하는 동적으로 삽입된 고정 문자열입니다. 그게 내 말의 의미 입니다 $1.

답변1

일치하는 항목이 있는지 확인해야 하는 경우 모든 입력 줄을 $1필수 접두사( ) 길이로 잘라낸 다음 고정 패턴 grep을 사용합니다.

if cut -c 1-"${#1}" | grep -qF "$1"; then
    echo "found"
else
    echo "not found"
fi

일치하는 행 수를 얻는 것도 쉽습니다.

cut -c 1-"${#1}" | grep -cF "$1"

또는 일치하는 모든 줄의 줄 번호(줄 번호는 1부터 시작):

cut -c 1-"${#1}" | grep -nF "$1" | cut -d : -f 1

줄 번호를 입력 head하고 tail일치하는 줄의 전체 텍스트를 얻을 수 있지만 Python이나 Ruby와 같은 최신 스크립팅 언어를 사용하는 것이 더 쉽습니다.

(위의 예에서는 Posix grep 및 cut을 가정합니다. 검색 중인 파일이 표준 입력에서 온다고 가정하지만 파일 이름을 사용하도록 쉽게 변경할 수 있습니다.)

$1편집: 또한 패턴( )이 길이가 0인 문자열이 아닌지 확인해야 합니다 . 그렇지 않으면 cut말할 수 없습니다 values may not include zero. 또한 Bash를 사용하는 경우 set -o pipefail오류 종료를 포착하는 데 사용합니다 cut.

답변2

백슬래시를 존중하는 Perl을 사용하는 방법

v="$1" perl -ne 'print if index($_, $ENV{"v"} )==0' file

이는 명령에 대한 환경 변수 v를 설정한 다음 해당 변수의 인덱스가 0(즉, 줄의 시작)인지 여부를 인쇄합니다.

awk에서도 같은 작업을 수행할 수 있습니다.

v="$1" awk 'index($0, ENVIRON["v"])==1' file

답변3

grep그 자체가 정규식의 일부인 ; 를 사용하여 이 작업을 수행하는 방법을 생각할 수 없으므로 ^이를 사용하려면 정규식을 해석해야 합니다. 부분 문자열 일치 awk또는 다른 방법을 사용하면 간단합니다 perl.

awk -v search="$1" 'substr($0, 1, length(search)) == search { print }'

포함된 검색 문자열을 처리하려면 \다음과 같은 트릭을 사용할 수 있습니다.답변 123개:

search="$1" awk 'substr($0, 1, length(ENVIRON["search"])) == ENVIRON["search"] { print }'

답변4

grep에 -P 옵션이 있는 경우 이는 다음을 의미합니다.폴리 메라 제 연쇠 반응, 다음과 같이 할 수 있습니다.

grep -P "^\Q$1\E"

이것을 참조하세요질문및 보기PCRE 문서원하시면 자세히 알아보세요.

관련 정보