, 그것을 당신이 처음 공백 이후에 나오는 모든 비 숫자를 제거 할 것으로 보인다 논리적으로 첫 번째 숫자 앞에옵니다. 대시, 밑줄, 심지어 점뿐만 아니라 글자도 제거해야합니다. 자리가 아닌 것.
이 상당히 최소한이다
sed -e 's/ [^0-9]*/ /'
, 그러나 당신의 기준을 충족 : 그 제안
$ cat data
host_192.168.0.100 host_192.168.0.100
ab-ab-abababab-ABABABAB-000.000.000.0 ab-ab-abababab-ABABABAB-000.000.000.0
$ sed -e 's/ [^0-9]*/ /' data
host_192.168.0.100 192.168.0.100
ab-ab-abababab-ABABABAB-000.000.000.0 000.000.000.0
$
좋은 정규 표현식을 서면으로 기술의 대부분은 당신이 정규 표현식 원하는 것을 잘 설명을 쓰고있다 실제로 (정규 표현식에 의미있는 용어로) 수행합니다.
선도 숫자와 문자를 가진 세 개의 새로운 항목 및 자료를 후행 상당히 삶을 복잡하게 :
는
$ cat data
host_192.168.0.100 host_192.168.0.100
ab-ab-abababab-ABABABAB-000.000.000.0 ab-ab-abababab-ABABABAB-000.000.000.0
01-admin-10.10.10.10 01-admin-10.10.10.10
10.10.10.10-NAT 10.10.10.10-NAT
1test-10.10.10.10 1test-10.10.10.10
$ sed -e 's/ [^0-9]*/ /' \
> -e 's/ [^.]*-\([0-9][0-9.]*[0-9]\)/ \1/' \
> -e 's/ \([0-9][0-9.]*[0-9]\)[^0-9.].*$/ \1/' data
host_192.168.0.100 192.168.0.100
ab-ab-abababab-ABABABAB-000.000.000.0 000.000.000.0
01-admin-10.10.10.10 10.10.10.10
10.10.10.10-NAT 10.10.10.10
1test-10.10.10.10 10.10.10.10
$
sed
스크립트는 3 개 독립적 인 청소 표현을 획득합니다. 첫 번째는 이전과 마찬가지로 공백 직후에 임의의 비 숫자를 제거합니다. 조정할 필요는 없습니다.
01-admin-
라인은 그 점에 전혀 영향을받지 않습니다. 두 번째 정규 표현식은 공백, 비 점 뒤에 순차를 따라 대시를 찾은 다음 숫자로 시작하는 시퀀스를 캡처하고, 삽입 된 숫자와 점으로 계속하고 숫자로 끝나며 기억 된 숫자와 점들의 문자열. 돌진과 일치하는 것은 일하는 sanely에 중요하다; 조심하지 않으면 *
이 너무 욕심이 많습니다 (예 : s/ .*\([0-9][0-9.]*[0-9]\)/\1/
). IP 주소 구성 요소의 앞자리가 너무 길어졌습니다. 나는 sed
에 비 욕심쟁이 한정어가 없다고 가정하고 있습니다 (예 : *?
). 귀하의 버전이 다른 답변을 제안 할 수도 있습니다 (그러나이 버전도 효과가 있습니다).다른 예외적 인 경우를 처리하기 위해 패턴을 조정해야 할 수도 있습니다. 이 질문에 대한 편집이 아니라 직접하십시오.
세 번째 정규 표현식은 후행 -NET
및 기타 이러한 자료를 처리합니다. 숫자와 점의 순서 (숫자로 시작하고 끝나는 순서)를 찾은 다음 비 숫자, 점이 아닌 문자 및 기타 후행 자료를 찾고 기억 된 숫자 및 점으로 대체합니다. 많은 조정이 필요하지는 않습니다.
이것은 지금까지 최고의 결과를 가지고 있지만 어떤 것들은 선택되지 않았습니다 아직까지. 나는 몇 가지 예를 추가했다 (주요 숫자, 훈련 편지 등). 당신이 그것을 처리 할 수 있다고 생각하십니까? :) – Numpty
sed 명령을 두 번째 열로 어떻게 제한 할 수 있었습니까? 당신이 정교 할 수 있으면 나는 이것을 더 청소할 수있을 것입니다. – Numpty
위대해 보이고, 조나단 (특히 설명을 위해) – Numpty