답변:
3 자 앞뒤 4 자
$> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}'
23_string_and
brew install homebrew/dupes/grep
하고로 실행하십시오 ggrep
.
grep -E -o ".{0,5}test_pattern.{0,5}" test.txt
패턴 전후에 최대 5 자까지 일치합니다. -o 스위치는 grep에게 일치 만 표시하고 -E는 확장 정규식을 사용하도록 지시합니다. 표현식 주위에 따옴표를 넣으십시오. 그렇지 않으면 쉘에서 해석 될 수 있습니다.
{0,255}
작품 {0,256}
제공grep: invalid repetition count(s)
당신은 사용할 수 있습니다
awk '/test_pattern/ {
match($0, /test_pattern/); print substr($0, RSTART - 10, RLENGTH + 20);
}' file
다음과 같이 의미합니다.
grep -o '.\{0,20\}test_pattern.\{0,20\}' file
?
의 양쪽에 최대 20 개의 문자가 인쇄됩니다 test_pattern
. \{0,20\}
표기법은 비슷 *
하지만 지정 스물 반복 제로 대신 0 개 느껴져요가 -o
아니라 전체 라인보다는 단지 경기 자체를 보여 말한다.
grep: Invalid content of \{\}
을 사용하면 gawk
일치 기능을 사용할 수 있습니다.
x="hey there how are you"
echo "$x" |awk --re-interval '{match($0,/(.{4})how(.{4})/,a);print a[1],a[2]}'
ere are
perl
다음 과 같이 하면보다 유연한 솔루션을 사용할 수 있습니다. 다음은 패턴 앞에 3 자, 실제 패턴에 이어 5 자 뒤에 인쇄합니다.
echo hey there how are you |perl -lne 'print "$1$2$3" if /(.{3})(there)(.{5})/'
ey there how
문자 대신 단어에 적용 할 수도 있습니다. 다음에 실제 일치하는 문자열 앞에 한 단어를 인쇄합니다.
echo hey there how are you |perl -lne 'print $1 if /(\w+) there/'
hey
다음은 패턴 뒤에 한 단어를 인쇄합니다.
echo hey there how are you |perl -lne 'print $2 if /(\w+) there (\w+)/'
how
다음은 패턴 앞에 하나의 단어를 인쇄 한 다음 패턴 뒤에 실제 단어와 한 단어를 인쇄합니다.
echo hey there how are you |perl -lne 'print "$1$2$3" if /(\w+)( there )(\w+)/'
hey there how
나는이 암호 명령 수정자를 쉽게 기억하지 못하므로 최고의 대답을 가져 와서 ~/.bashrc
파일 의 함수로 바꿨습니다 .
cgrep() {
# For files that are arrays 10's of thousands of characters print.
# Use cpgrep to print 30 characters before and after search patttern.
if [ $# -eq 2 ] ; then
# Format was 'cgrep "search string" /path/to/filename'
grep -o -P ".{0,30}$1.{0,30}" "$2"
else
# Format was 'cat /path/to/filename | cgrep "search string"
grep -o -P ".{0,30}$1.{0,30}"
fi
} # cgrep()
실제 모습은 다음과 같습니다.
$ ll /tmp/rick/scp.Mf7UdS/Mf7UdS.Source
-rw-r--r-- 1 rick rick 25780 Jul 3 19:05 /tmp/rick/scp.Mf7UdS/Mf7UdS.Source
$ cat /tmp/rick/scp.Mf7UdS/Mf7UdS.Source | cgrep "Link to iconic"
1:43:30.3540244000 /mnt/e/bin/Link to iconic S -rwxrwxrwx 777 rick 1000 ri
$ cgrep "Link to iconic" /tmp/rick/scp.Mf7UdS/Mf7UdS.Source
1:43:30.3540244000 /mnt/e/bin/Link to iconic S -rwxrwxrwx 777 rick 1000 ri
문제의 파일은 하나의 연속 25K 라인이며 regular을 사용하여 찾고있는 것을 찾는 것은 희망이 없습니다 grep
.
cgrep
이 병렬 grep
메소드를 호출 할 수있는 두 가지 다른 방법에 주목하십시오 .
"$ 2"가 4 줄의 코드를 저장하도록 설정된 경우에만 전달되는 함수를 생성하는 "niftier"방법이 있습니다. 그래도 편리하지는 않습니다. 같은 것 ${parm2} $parm2
. 그것을 찾으면 기능 과이 답변을 수정합니다.