sed를 사용하여 숫자를 2 자리로 제로 채우기


19

입력:

201103 1 /mnt/hdd/PUB/SOMETHING
201102 7 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 3 /mnt/hdd/PUB/SOMET HING
201106 1 /mnt/hdd/PUB/SOMETHI NG

원하는 출력 :

201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG

01를 들어 "일"부분에 한 자리 만 있는 경우 어떻게 추가 할 수 있습니까? 이 날짜 형식이 필요합니다 : YYYYMM DD.

답변:


13
$ sed 's/\<[0-9]\>/0&/' ./infile
201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG

이것이 어떻게 작동하는지 설명 할 수 있습니까? 이것은 내가 \<[0-9]\>단일 숫자와 일치하지만이 구문이 무엇인지 확실하지 않은 구문이라고 생각 하는 구문을 처음으로보고 있습니다. 감사.
sasuke

2
\ <의미 : '단어'의 시작 ... [0-9]는 0에서 9까지의 한 자리 숫자를 의미합니다 ... \> 의미 : '단어'의 끝 ... 단어 : 공백으로 구분 된 토큰 (또는 줄의 시작 / 끝에서 각각 \ <및 \>에 대해 시작 / 종료) ... PS. 방금 문장 부호를 시도했습니다. 또한 구분 기호입니다.
Peter.O

1
또한 괄호를 캡처하지 않고이 작업을 수행 할 수 있습니다 &일치 LHS를 사용하는 대체 문자열에서 -sed 's/\<[0-9]\>/0&/'
글렌 잭맨

아, 이것이 <>쉘 정규 표현식 구문의 단어 경계라는 것을 알지 못했습니다 . sed 's / \ b [0-9] \ b / 0 & /'조차도 작동한다고 생각하십시오. 둘 다 감사합니다. :)
sasuke

@sasuke : <>의 특징 인 확장 된 정규식 (하지의 등 껍질) ... 버전과 어떤 사용 옵션에 따라가, sed그리고이 shell모두 사용 중 수 확장 또는 표준 정규 표현식 ... 표준 정규식 사용\<\>
피터. O


2

여기서 사용으로 (비 나오지) 방법 떠들썩한 파티확장 정규식 ..
본 방법의 범위는 개별 라인의 더 복잡한 처리를 수행 할 수있다. (즉, 정규 표현식 대체 이상)

while IFS= read -r line ; do
    if [[ "$line" =~ ^(.+\ )([0-9]\ .+)$ ]]  
    then echo "${BASH_REMATCH[1]}0${BASH_REMATCH[2]}" 
    else echo "$line"
    fi
done <<EOF
201103 1 /mnt/hdd/PUB/SOMETHING
201102 7 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 3 /mnt/hdd/PUB/SOMET HING
201106 1 /mnt/hdd/PUB/SOMETHI NG
EOF

산출:

201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG

1

나는 이런 식으로 할 것입니다 :

sed -E 's/ ([0-9]) / 0\1 /' ./input

이것은 외로운 숫자를 잡고 그룹으로 공백을 제거한 ' ([0-9]) '다음 0과 공백으로 채워 넣습니다 ' 0\1 '.

-E옵션을 사용하면 OSX에서 최신 RegEx 표현식을 사용할 "\"수 있습니다 ( 따라서 자주 사용하지 않아도 됨 ) -r. 테스트 한 Linux 시스템에서 동일한 작업을 수행합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.