다음 줄을 고려하십시오.
842567831752rajfkglxfgk kerigjeiofjgoe jergjerio4523789573489
genfjkgnerijio 234578934897 jgioefjgio shfhuwehjdfu7890345289103
Linux의 위 줄에서 789 다음 네 자리를 얻는 방법
답변1
grep 사용
grep -Po '(?<=789).{4}'
설명하다
grep -P
: Perl 모드에서 grep 사용-o
: 일치하는 부분만 반환(?<=789)
: 뒤를 돌아보세요. 이는 "일치" 섹션 앞에 나타나야 합니다..{4}
: 4개의 문자와 일치합니다(lookbehind 이후). 이것이 반환될 내용입니다.
아니면 sed를 사용하세요
sed -r 's/.*789(.{4}).*/\1/'
789
이는 대기열에 하나만 있다고 가정합니다.
설명하다
sed -r
: 가독성을 높이려면 확장 정규식 모드에서 sed를 사용하세요.s/foo/bar/
: 사용foo
. . . 교체bar
..*789(.{4}).*
: 줄의 시작 부분과 일치한.*
다음789
4개의 문자를 일치시키고(.{4})
두 문자를 모두 캡처한()
다음 줄의 나머지 부분을 캡처합니다.*
. 이는 전체 라인과 정확히 일치합니다.\1
: 전체 줄을 위에서 일치하는 첫 번째 패턴으로 바꿉니다.
아니면 awk를 사용하세요
awk '{if (match($0,/789(.{4})/,m)) print m[1]}'
789
이는 대기열에 하나만 있다고 가정합니다. awk에서는 이를 수행하는 방법이 6가지 정도 있을 수 있습니다.
설명하다
match($0,/789(.{4})/,m)
: 전체 줄에서$0
정규식을 찾아789(.{4})
다음 4개의 문자를 캡처합니다789
.print m[1]
:첫 번째 캡처 그룹을 인쇄합니다.
그냥 숫자
숫자만 얻으려면 다음과 같이 사용할 수 있습니다.
grep -Po '(?<=789).*' | sed -r 's/^[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9]).*/\1\2\3\4/'
이 전략은 다음을 가정합니다.예마지막 네자리 789
.
설명하다
grep -Po '(?<=789).*'
:위와 유사하지만 출력모두.789
| sed -r 's/foo/bar/'
:확장 정규식 패턴을 사용하여 sed로 파이프하고foo
`bar로 바꿉니다.^[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9])[^0-9]*([0-9]).*
: 줄의 시작 부분^
과 숫자가 아닌 모든 문자를 일치시킨[^0-9]*
다음 숫자를 캡처합니다([0-9])
. 이것을 세 번 더 반복하고 나머지 줄을 일치시킵니다.*
.\1\2\3\4
: 전체 줄, 즉 다음 4자리를 캡처 그룹으로 바꿉니다.
(또는 Perl의 non-greedy 정규 표현식을 사용하여 sed 표현식을 단순화할 수 있습니다. perl -pe 's/.*?([0-9]).*?([0-9]).*?([0-9]).*?([0-9]).*/\1\2\3\4/'
)
답변2
$ echo "842567831752rajfkglxfgk kerigjeiofjgoe jergjerio4523789573489" | grep -oP '789\K....'
5734
$ echo "genfjkgnerijio 234578934897 jgioefjgio shfhuwehjdfu7890345289103" | grep -oP '789\K....'
3489
0345
답변3
AWK
4자리 숫자 이후의 모든 항목을 찾는 솔루션 789
:
awk -F'789' '{ for(i=2;i<=NF;i++) printf "%s%s",(i==2?"":" "),substr($i,1,4); print ""}' file
-F'789'
-789
필드 구분자로 처리됩니다.
출력(발견된 모든 항목각 라인):
5734
3489 0345
----------
또는 각 항목을 별도의 줄에 인쇄하면 됩니다.
awk -F'789' '{ for(i=2;i<=NF;i++) print substr($i,1,4) }' file
산출:
5734
3489
0345