세미콜론으로 구분된 주소를 추출하고 각 주소를 한 줄에 인쇄합니다.

세미콜론으로 구분된 주소를 추출하고 각 주소를 한 줄에 인쇄합니다.

다음 입력이 포함된 파일이 있습니다. 점으로 구분된 숫자는 주소를 나타냅니다. 주소의 모든 숫자는 아래와 같이 하나 이상의 숫자일 수 있습니다.

[112.112.112.112;3.3.3.3;44.44.44.44]
[6.6.6.6;17.17.17.17;88.88.88.88]

세미콜론과 괄호 없이 각 주소를 추출하고(주소는 세미콜론으로 구분됨 ;) 새 파일의 한 줄에 각 주소를 삽입하여 다음 출력을 생성하고 싶습니다.

112.112.112.112
3.3.3.3
44.44.44.44
6.6.6.6
17.17.17.17
88.88.88.88

첫 번째 단계로 다음과 같이 주소를 추출하기 위해 grep을 시도합니다.

grep -E '\d+\.\d+\.\d+\.\d+' myfile.txt > newfile.txt

그러나 아무것도 인쇄되지 않습니다.

답변1

확장 정규식( -E또는 egrep) 모르겠어요 \d. -P@Alexander가 제안한 대로 -Eor [0-9]를 사용하세요 [[:digit:]].

-o전체 일치 행 대신 일치 항목만 선택 하도록 추가되었습니다 . 또한 개별 일치 항목을 새 행으로 나눕니다.

grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' myfile.txt

또는

grep -Eo '[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+' myfile.txt

사용펄 정규식( -P또는 pgrep):

grep -Po '\d+\.\d+\.\d+\.\d+' myfile.txt

+다음 으로 변경해 *도 작동합니다 .기본 정규식:

grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' myfile.txt

답변2

-E다음으로 바꾸고 -P추가하세요 -o.

 grep -P -o '\d+\.\d+\.\d+\.\d+' myfile.txt

답변3

사용 awk:

awk 'NF' RS='[][;]' infile

또는 tr첫 번째 빈 줄이 마음에 들지 않으면 다음을 수행하십시오.

tr -s '];[' '\n' <infile

답변4

grep작업에 약간 과잉입니다. tr충분한:

$ < input.txt tr -d '[]' | tr ';' '\n' | sort -u

sort -u섹션에서는 중복된 주소를 제거합니다.

관련 정보