
다음 입력이 포함된 파일이 있습니다. 점으로 구분된 숫자는 주소를 나타냅니다. 주소의 모든 숫자는 다음과 같이 하나 이상의 숫자일 수 있습니다.
[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가 제안한 대로 사용하거나 또는 대신 -E
에 사용하세요 .[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
입니다.