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 }'