2013-03-26 2 views
0

awk print $ 2, sed [a-z] 등을 통해 조각으로이 작업을 수행 할 수 있었지만 한꺼번에 sed를 통해 하나의 스트림으로 어떻게 처리 할 수 ​​있습니까?sed - 두 번째 열에서 A-Z를 제거하는 방법

host_192.168.0.100 192.168.0.100 

는 또한, '호스트'단지 자리 표시 자에

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 

감사합니다!

답변

1

, 그것을 당신이 처음 공백 이후에 나오는 모든 비 숫자를 제거 할 것으로 보인다 논리적으로 첫 번째 숫자 앞에옵니다. 대시, 밑줄, 심지어 점뿐만 아니라 글자도 제거해야합니다. 자리가 아닌 것.

이 상당히 최소한이다
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 및 기타 이러한 자료를 처리합니다. 숫자와 점의 순서 (숫자로 시작하고 끝나는 순서)를 찾은 다음 비 숫자, 점이 아닌 문자 및 기타 후행 자료를 찾고 기억 된 숫자 및 점으로 대체합니다. 많은 조정이 필요하지는 않습니다.

+0

이것은 지금까지 최고의 결과를 가지고 있지만 어떤 것들은 선택되지 않았습니다 아직까지. 나는 몇 가지 예를 추가했다 (주요 숫자, 훈련 편지 등). 당신이 그것을 처리 할 수 ​​있다고 생각하십니까? :) – Numpty

+0

sed 명령을 두 번째 열로 어떻게 제한 할 수 있었습니까? 당신이 정교 할 수 있으면 나는 이것을 더 청소할 수있을 것입니다. – Numpty

+0

위대해 보이고, 조나단 (특히 설명을 위해) – Numpty

1

이 시도 :

sed 's/^\([^ ]*\) [a-z_-]*\(.*\)/\1 \2/i' 

편집 : 변경된 요구 사항을 반영하기 위해 업데이트을. 일할 수있는

1

가장 단순한 방법 :

sed 's/ [A-Za-z_]*/ /' 

예 : 두 번째 예를 감안할 때

$ sed 's/ [A-Za-z_]*/ /' <<<'host_192.168.0.100 host_192.168.0.100' 
host_192.168.0.100 192.168.0.100 
+0

이것은 Ansgar가 게시 한 것보다 더 잘 작동하는 것으로 보이지만, 하이픈이 찍힌 문자가있는 경우 이전 문자는 잡히지 않습니다. 예는 다음과 같습니다 AB-AB-abababab-ABABABAB-000.000.000.0 이 -ab-abababab-ABABABAB-000.000.000.0 – Numpty

+0

로 바뀝니다 내가 * 모든 * 제거 : – Numpty

+1

'교체 시도 [A-ZA-Z_ 그들을 필요 ]'를'[^ 0-9.] '와 함께 사용하면 모든 것을 맨 앞자리로 옮겨야합니다. – William

관련 문제