숫자 조직 구성표에 다양한 수의 선행 0을 추가하기 위해 sed 구문을 다운시키는 데 문제가 있습니다. 내가 운영하는 문자열은 다음과 같습니다.
1.1.1.1,Some Text Here
sed 구문 활용
sed -r ":r;s/\b[0-9]{1,$((1))}\b/0&/g;tr"
응답을 이끌어 낼 수 있습니다
01.01.01.01,Some Text Here
그러나 내가 찾고있는 것은 모든 항목의 표준 길이가 [0-9]에 있도록 필드 2와 3에서 최대 2 자리, 필드 4에서 3 자리까지 0으로 채우는 것입니다. [0-9] { 2}. [0-9] {2}. [0-9] {3}
1.01.01.001,Some Text Here
내 인생에서 나는 마침표 뒤에 오는 숫자에만 스냅하는 데 필요한 매개 변수를 포함하도록 경계를 수정하는 방법조차도 알 수 없습니다. 단어 경계에서 0 문자와 일치하는 것으로 이해하는 \ b를 사용하는 것과 관련이 있다고 생각하지만 일치에 마침표를 추가하려는 시도가 다음과 같이 실패하는 이유를 이해하지 못합니다.
sed -r ":r;s/\.\b[0-9]{1,$((1))}\b/0&/g;tr"
sed -r ":r;s/\b\.[0-9]{1,$((1))}\b/0&/g;tr"
Both cause the statement to hang
sed -r ":r;s/\b[0-9]\.{1,$((1))}\b/0&/g;tr"
sed -r ":r;s/\b[0-9]{1,$((1))}\.\b/0&/g;tr"
sed -r ":r;s/\b[0-9]{1,$((1))}\b\./0&/g;tr"
cause the statement to output:
1.01.01.1,Some Text Here
또한 진술에 다음과 같은 텍스트가 포함되어 있으면 추가 문제가 발생할 것으로 예상합니다.
1.1.1.1,Some Number 1 Here
sed와 그 모든 복잡성을 실제로 배워야한다는 것은 명백한 결론입니다. 나는 그 일을하고 있지만이 특정 진술이 계속해서 문제를 일으킬 것으로 기대합니다. 도움을 주시면 감사하겠습니다.
편집 : 나는 방법을 알아 냈습니다 ...이 진술은 내가 찾고있는 것을하는 것처럼 보이지만 이것을 수행하는보다 우아한 방법이 있어야합니다.
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
또한 텍스트에 비슷한 숫자 형식이 표시되면 구문 상 문제가 발생할 수 있습니다.
1.1.1.1,Some Text Referring to Document XXX Heading 1.2.3
이 경우 다음과 같은 결과가 발생합니다.
1.01.01.001,Some Text Referring to Document XXX Heading 01.02.03
해결 도와 주셔서 감사합니다. 처음에 아래에서 수락 한 답변으로 문제를 해결했습니다. 아래 정렬을 활용하여 더 큰 솔루션의 일부로 솔루션을 Python으로 옮겼습니다.
def getPaddedKey(line):
keyparts = line[0].split(".")
keyparts = map(lambda x: x.rjust(5, '0'), keyparts)
return '.'.join(keyparts)
s=sorted(reader, key=getPaddedKey)
printf
(또는 printf
Awk 내 전화)이 더 간단 할 수 있습니다.
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
그러나 더 우아한 접근법이 있는지 알고 싶습니다.