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 g
et - g
et 패턴 공간을 덮어써 기존 공간을 덮어씁니다.h
답변4
회의
sed -r '/^..../s/:0+/:/g'
괜찮으세요? (Giles는 처음 4자를 변경하지 않고 답변을 개선했습니다.)