2017-12-31 88 views
2

sed에 파일 이름을 인자로 갖는 스크립트를 작성하려고합니다.4 번째 자리 이후에 숫자를 복제하는 3 자리 이상이있는 줄을 출력하도록합니다.

내 목표는 최소한 3 개의 숫자가 포함 된 모든 줄을 파일에 인쇄하는 것입니다. . 네 번째 숫자 다음에 모든 숫자를 반복해야합니다. sed을 사용하는 솔루션이 필요합니다.

예 입력 파일 :

abc 1 def2 3 ab45 z11 
123 zy 
ab1cd2ef3gh4z56 
abc12aa 

원하는 출력 :

abc 1 def2 3 ab455 z1111 
123 zy 
ab1cd2ef3gh4z5566 

내가 시도하는 것 :

sed '/[0-9].*[0-9].*[0-9]/d' ./F1 

4 번째 자리 이후에 모든 숫자를 어떻게 복제 할 수 있는지 알 수 없습니다.

+1

이것은 숙제입니다. 맞습니까? 질문이 명확하지 않으므로 선생님에게 질문하십시오. –

답변

6

, 당신은 다음과 같은 작업을 수행 할 수

$ sed -E '/([[:digit:]].*){3}/!d;s/[[:digit:]]/&&/5g' infile 
abc 1 def2 3 ab455 z1111 
123 zy 
ab1cd2ef3gh4z5566 

첫 번째 명령, /([[:digit:]].*){3}/!d는 적어도 세 자리를 포함하지 않는 모든 행을 삭제합니다.

두 번째 명령 s/[[:digit:]]/&&/5g은 숫자를 반복합니다. 5g 플래그는 "5 번째 이후부터 모든 발생"으로 변환됩니다. 숫자 플래그를 g과 섞을 때의 동작은 POSIX에 의해 지정되지 않습니다. GNU sed는 원하는 방식으로 동작합니다.

-E 플래그는 편의를위한 것입니다. 그것없이, 우리는 (){}을 탈출해야 : 당신의 SED가 -E을 이해하지 못하는

sed '/\([[:digit:]].*\)\{3\}/!d;s/[[:digit:]]/&&/5g' infile 

경우, 대신 -r을 사용할 수 있습니다. -E은 GNU sed에서 수년간 사용되었지만 (문서화되지 않았 음) BSD seds는 -E을 사용합니다. POSIX는 here과 같이 sed에 -E을 포함합니다. 일부 오래된 시스템은 -r 만 이해합니다.

+0

이렇게 간단합니다 ... +1, 나는 완전히 ' g' 플래그를 잊어 버렸습니다 ... – PesaThe

+0

@Micael 죄송합니다, 좋은 점을 높이기 위해 편집을 "거부"하지 않고 "개선"하려고했지만 의미가 없습니다. - 클릭 한 사람 ... –

1

sed 절대적이에 대한 잘못된 도구입니다,하지만 재미있는 도전 : 기본적으로

sed -E -e '/([^0-9]*[0-9]){3}/{ h; s///; 
    s/([0-9])/\1\1/g; x; s/(([^0-9]*[0-9]){3}).*/\1/; G; s/\n//; }' input 

, 당신은 다음 주요 부분 (처음 3 자리)를 빼내야, 라인을 잡아. 그런 다음 모든 자릿수를 복제하고 원래의 행을 다시 패턴 공간으로 가져 오는 공간을 유지하기 위해 스왑합니다. 꼬리를 삭제 한 다음 보류 공간의 새 꼬리를 패턴 공간에 다시 추가하십시오. GNU가 나오지으로

+0

's ///;'는 어떻게 작동합니까? 어쩌면 문서를 가리킬 수도 있습니다. – PesaThe

+0

빈 패턴이 마지막 일치를 반복합니다. 그렇다고해서 5 일 대신에 4 일의 자릿수를 복제하지 않습니까? –

+0

@PesaThe https://www.gnu.org/software/sed/manual/sed.html#Regexp-Addresses, "빈 정규 표현식 ..." –