sed를 사용하여 선행 0을 선택적으로 제거하는 방법

sed를 사용하여 선행 0을 선택적으로 제거하는 방법

0다음을 사용하여 그 중 하나를 교체/제거하려면 어떻게 해야 합니까 sed?

2001:0db8:03cd:0000:0000:ef45:0006:0123

다음과 같이 만드세요:

2001:db8:3cd:::ef45:6:123

:중앙에는 4개씩 8개의 분할이 있습니다.

네 번째 조각은 잃어버려서는 안 된다어느 0그리고 다른 것들은 오직선두0개를 제거할 수 있습니다.

답변1

따라서 연속된 s를 제거하고 싶지만 0앞에 콜론이 있는 경우에만 가능합니다.

sed -e 's/:00*/:/g'

답변2

비슷한 접근 방식이 사용됩니다 awk.

awk '{gsub(/:0*/,":")}1' file
2001:db8:3cd:::ef45:6:123

답변3

처음 4자리를 제외한 0을 제거하는 방법에 여전히 관심이 있다면 다음을 수행할 수 있습니다.

sed 'H;g;s/\(\n\([^:]*\)\)*0*/\2/g
' <<\IN
2001:0db8:03cd:0000:0000:ef0405:00060:0123
IN

산출

2001:db8:3cd:::ef45:6:123

좋아, 그러면 이것은 전역적으로 0개 이상의 개행 문자 시퀀스와 일치하고 그 뒤에는 0개 이상의 콜론이 아닌 문자 또는 0개 이상의 0이 뒤따릅니다. 첫 번째 시퀀스는 두 개의 하위 그룹으로 나뉩니다. 하나는 ewline을 포함 \n하고 다른 하나는 포함하지 않습니다. 그렇게 하는 그룹은 이지만 \1, 그렇게 하지 않고 대체하는 하위 그룹은 입니다 \2. 따라서 중복된 \n줄줄이 문자가 제거됩니다. 시퀀스에 없는 일치하는 0은 다음과 같습니다.아니요전혀 저장되지 않았으므로 삭제되었습니다.

H개행 문자는 이전 문자부터만 검색됩니다. 공백을 보존하기 위해 줄 바꿈 문자 뒤에 줄을 추가합니다.\n(항상 비어있는 상태에서 시작)- then get - get 패턴 공간을 덮어써 기존 공간을 덮어씁니다.h

답변4

회의

sed -r '/^..../s/:0+/:/g'

괜찮으세요? (Giles는 처음 4자를 변경하지 않고 답변을 개선했습니다.)

관련 정보