현재 sed에 파이핑하여 반향된 영숫자 문자열을 수정하려고 합니다. 내가 수정하고 싶은 영역은 앞에 적절한 수의 0을 삽입하여 8자 길이로 만들고 싶은 숫자 블록입니다. 예를 들어:
입력하다:
loremipsumdolorsit2367amet
원하는 출력:
loremipsumdolorsit00002367amet
sed를 사용하여 이 작업을 수행할 수 있습니까? 내가 다루고 있는 숫자 블록은 8자 미만입니다. 나는 확실하지 않다이것게시물이 매우 유용합니다.
편집: 각 문자열에는 숫자 세트가 하나만 있습니다.
답변1
이는 숫자 뒤에 숫자가 아닌 텍스트가 따른다고 가정합니다.
echo "loremipsumdolorsit2367amet" \
| sed -r -e 's/[0-9]/0000000&/' -e 's/0*([0-9]{8}[^0-9])/\1/'
결과: loremipsumdolorsit00002367amet
이는 다음을 가정하지 않습니다.
... | sed -r -e 's/[0-9]/0000000&/' -e 's/0*([0-9]{8}([^0-9]|$))/\1/'
그들은 sed의 ERE 모드를 사용합니다. 많은 sed 구현에서는 이 -r
플래그를 사용하여 이를 지정합니다. 일부 -E
에서는 두 가지 플래그를 모두 사용합니다. 현재 sed에서 ERE 모드를 사용하는 기능은 POSIX 표준의 일부가 아니지만 표준에 추가하기 위한 논의가 진행 중입니다. 나는 어떤 방식으로든 ERE 모드를 사용하지 않는 최신 sed 구현을 아직 본 적이 없습니다.
경우에 따라 기본 sed 모드(BRE)를 사용하여 수행할 수 없는 작업이 ERE 모드를 사용하여 수행될 수 있습니다. 바라보다이 답변에 대한 댓글. 하지만 현재 상황에서는 ERE 모드를 사용하는 것은 단지 편의를 위한 것일 뿐입니다. sch가 의견에서 말했듯이 -r
(또는 ) 플래그를 생략하고 with 및 로 -E
바꿀 수 있습니다 . 내 원래 답변은 BRE 패턴의 일부가 아닌 BRE를 사용했지만 실제로는 솔루션에 필요하지 않습니다.(...)
\(...\)
{8}
\{8\}
+
답변2
모든 sed의 경우:
sed 's/[0-9]\{1,\}/0000000&/g;s/0*\([0-9]\{8,\}\)/\1/g'
답변3
이는 Perl을 사용하여 달성할 수 있습니다.
perl -e 'my $a="loremipsumdolorsit2367amet"; $a =~ s/([0-9]+)/sprintf("%010d",$1)/e; print $a'
얻다:
loremipsumdolorsit0000002367amet
모든 입력 라인을 처리합니다.
perl -pe 's/([0-9]+)/sprintf("%010d",$1)/e'
답변4
sed도 아니지만 여기에 약간 더 정교한(GNU) awk 대안이 있습니다.
echo loremipsumdolorsit2367amet | awk '{gsub( /[0-9]+/, sprintf( "%08d", gensub(/[^0-9]/, "","g"))); print}'
loremipsumdolorsit00002367amet