
IP 주소 목록이 포함된 파일이 있지만 일부 문자열은 IP 주소가 아니며 해당 문자열을 더미 IP 주소로 바꾸고 싶습니다.
나는 이것을 grep
IP 검색에 사용하고 있습니다. 하지만 일치하지 않는 것을 더미 IP 주소로 바꾸는 방법을 모르겠습니다. 나는 이것이 로 이루어질 수 있다고 믿습니다 sed
. 나는 몇 가지를 시도했지만 그 중 아무것도 작동하지 않았습니다.
cat file.txt | grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
파일의 IP 주소와 일치하는 것이 있지만 sed
IP가 아닌 주소를 더미 IP로 바꾸는 방법을 모르겠습니다.
sed -rn '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' file.txt
입력:
192.168.10.20
00 03
10.28.214.5
192.168.10.40
BF
192.168.10.50
원하는 출력:
192.168.10.20
192.168.0.0
10.28.214.5
192.168.10.40
192.168.0.0
192.168.10.50
감사해요!
답변1
귀하의 정규 표현식은 다음과 일치합니다.~ 아니다IPv4 점4개 주소는 비슷하지만 비슷해 보입니다(예 256.256.256.256
: IPv4 주소와 많이 비슷해 보이지만 그렇지 않음).
일치하는 것만유효한IPv4 주소의 경우 다음과 같은 정규식을 사용해야 합니다.
(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
또는 (perlish ?:
비캡처 그룹 수정자 제외):
((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
그리고 이는 적절하게 고정되어야 합니다(예: ^
및 $
, \b
양쪽 끝에 또는 \<
및 ) \>
.
보다:정규식 요리책Jan Goyvaerts와 Steven Levithan 저작, O'Reilly Media, Inc. 출판
예를 들어
$ sed -E '/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/!s/.*/192.168.0.0/' file.txt
192.168.10.20
192.168.0.0
10.28.214.5
192.168.10.40
192.168.0.0
192.168.10.50
$ perl -p -e 's/.*/192.168.0.0/ unless m/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/' file.txt
192.168.10.20
192.168.0.0
10.28.214.5
192.168.10.40
192.168.0.0
192.168.10.50
이 두 가지 모두 라인이 유효한 IPv4 주소와 일치하지 않는 한 전체 입력 라인을 192.168.0.0으로 변경합니다.
개인적으로 저는 Perl을 사용하고 싶습니다.정규 표현식::공통모듈은 일반적인 패턴 일치 작업을 위한 대규모 정규식 모음으로, 이라는 해시에서 편리하게 사용할 수 있습니다 %RE
.
$ perl -MRegexp::Common -p -e 's/.*/192.168.0.0/ unless m/^$RE{net}{IPv4}$/' file.txt
192.168.10.20
192.168.0.0
10.28.214.5
192.168.10.40
192.168.0.0
192.168.10.50
답변2
참고: 다른 사람들은 IPv4 주소에 대해 선택한 정규식에 결함이 있다고 지적했습니다. 다른 곳에서도 잘 다루어졌기 때문에 여기서는 다루지 않겠습니다.
sed를 사용할 수 있습니다씨!
RE와 일치 하지 않는( ) 행에 hange 명령을 실행합니다 .
$ sed -r '/([0-9]{1,3}\.){3}[0-9]{1,3}/!c\
192.168.0.0
' file.txt
192.168.10.20
192.168.0.0
10.28.214.5
192.168.10.40
192.168.0.0
192.168.10.50
GNU sed를 사용하면 다음과 같이 단순화할 수 있습니다.
sed -r '/([0-9]{1,3}\.){3}[0-9]{1,3}/!c192.168.0.0' file.txt
답변3
sed '/^\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}$/!s/.*/192.168.0.0/' data
행이 유효한 IPv4 주소가 아닌 경우 현재 행을 다음으로 바꾸십시오 192.168.0.0
.
대신 더미 주소에 다른 값을 사용하는 것이 좋지만 192.168.0.0
이는 귀하와 청소년의 필요에 달려 있습니다.
또는 동일하지만 다음과 같습니다 awk
.
awk '!/^([0-9]{1,3}\.){3}[0-9]{1,3}$/ {$0="192.168.0.0"}1' data
또는 perl
:
perl -MNet::IP -ple '$_ = "192.168.0.0" unless new Net::IP($_)' data
답변4
와 함께 Perl
:
- 한 자리가 아닌 한 선행이 0이 아니라는 제약 조건을 사용하여 1~3자리로 구성된 옥텟의 정규식을 정의합니다.
- 선이 점으로 구분된 정확히 4옥텟으로 구성되어 있는지 확인합니다.
- 라인을 점으로 분할하고 모든 튜플이 256보다 작은지 확인합니다.
dummy=192.168.0.0 \
perl -MList::Util=all -lpe '
$octet //= qr/(?!0\d)\d{1,3}/;
/^$octet(?:[.]$octet){3}$/ &&
all { $_<256 } split /[.]/ or
$_ = $ENV{dummy};
' file