셸 스크립트 : 텍스트 중간에, 때로는 시작 부분에 문자열을 가져옵니다


9

큰 텍스트 파일이 있는데 그 부분이 다음과 같습니다 (편집 된 값).

JULIANA XXXX006060 LI1033322 THC BRL 730.00
XXXX006296 AA1004737 THC BRL 1,740.00
SANTOS JULIANA XXXX006668 AA1004786 THC BRL 8,150.00
SANTOS JULIANA CABINDA XXXX006697 AA1004777 THC BRL 2,325.00
SANTOS JULIANA XXXX006699 AA1004790 THC BRL 2,325.00
JULIANA BATA XXXX006141 CCC012946 THC BRL 1,460.00
JULIANA BATA XXXX006153 CCC013054 THC BRL 870.00
JULIANA XXXX006269 CCC013105 THC BRL 870.00
JULIANA XXXX006295 CCC013083 THC BRL 870.00
JULIANA BATA XXXX006305 CCC013043 THC BRL 1,460.00

난 항상 (A로 잡고 싶어 cut하거나 awk또는 뭔가 다른) 문자열을 그와 함께 시작 XXXX00하지만,이 같은 필드 번호에 결코 없다.

쉘 스크립트로 어떻게 할 수 있습니까?

답변:


12

그냥 grep:

grep -oE 'XXXX00[0-9]*' file
  • -o: 일치하는 부분 만 인쇄합니다.
  • -E: 확장 정규식을 활성화합니다.
  • [0-9]*: 검색 할 문자열 뒤에 숫자 만 나타납니다.

정규식에는 -E옵션이 필요 하지 않습니다 (해롭지는 않지만).
Jonathan Leffler


3

grepPCRE와 함께 사용 :

% grep -Po '(^|\s)\KXXXX00[^\s]*(?=(\s|$))' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305

-w이 경우 (word)를 사용하여 벗어날 수 있습니다 . 단어 구성 문자는 다음과 같이 간주됩니다 [[:alnum:]_].

% grep -wo 'XXXX00[^ ]*' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305

2

다른 몇 가지 방법

GNU로 awk

awk -vRS='[[:space:]]+' '/^X{4}0{2}/' file

이전 버전의 GNU awk에서는 --re-interval필요할 수 있습니다.

awk --re-interval -vRS='[[:space:]]+' '/^X{4}0{2}/' file

trgrep

<file tr -s '[:space:]' '[\n*]' | grep '^X\{4\}0\{2\}'

1
sed 's/[^0]*  *\([^ ]*\).*/\1/' <in >out

거기에 사람들의 목록이 있고 이름의 수가 다르기 때문에 필드 수가 다른 것처럼 보입니다. 그러나 그들 중 어느 것도 0을 가진 이름을 가지고 있지 않으므로, 첫 번째 공백으로 구분 된 문자열을 완전히 잘라내어 저장하고 다음에 오는 모든 것을 잘라 내십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.