일치하는 정규식에 접미사 추가

일치하는 정규식에 접미사 추가

첫 번째 필드에 숫자가 포함된 행이 있습니다.

46066.874.89
48569.123.56
56489.256.88
654.12.32
84689.25.69

지금 하고 싶은 일은 00네 번째 줄 끝에 654파일을 추가하고 첫 번째 줄 앞에 세 번째 숫자를 추가하는 것입니다 .. 어떻게 해야 하나요? 나는 사용하려고

sed 's/^[0-9][0-9][0-9]./&00/'

하지만 내가 얻는 결과는

4606006.874.89
4856009.123.56
5648009.256.88
654.0012.32
8468009.25.69

답변1

거의 다 왔습니다:

$ sed -E 's/^([0-9][0-9][0-9])\./\100./' file 
46066.874.89
48569.123.56
56489.256.88
65400.12.32
84689.25.69

답변2

명령 sed은 세 자리 숫자 뒤에 두 개의 0을 삽입하고 각 줄의 시작 부분에 또 다른 문자를 삽입합니다. "모든 문자" 와 일치합니다 .. \.실제 포인트 와 일치시키기 위해 포인트를 이스케이프 처리했는데도 0이 두 개 삽입됩니다.뒤쪽에가리키다.

약간만 조정하면 문제가 해결됩니다.

$ sed 's/^\([0-9]\{3\}\)\./\100./' file
46066.874.89
48569.123.56
56489.256.88
65400.12.32
84689.25.69

또는 sed확장 정규식을 지원하는 경우(요즘 대부분 지원):

$ sed -E 's/^([0-9]{3})\./\100./' file
46066.874.89
48569.123.56
56489.256.88
65400.12.32
84689.25.69

보다 일반적으로 사용 awk하고 만드십시오.

$ awk -F . 'BEGIN { OFS=FS } length($1) < 5 { $1 = sprintf("%s%.*d", $1, 5 - length($1), 0) }; 1' file
46066.874.89
48569.123.56
56489.256.88
65400.12.32
84689.25.69

awk길이가 5자 미만인 첫 번째 점으로 구분된 열의 ​​각 항목에 대해 이 명령은 문자열의 총 길이가 5자가 되도록 문자열을 필요한 개수의 0으로 채웁니다.

이는 정수를 누락된 길이의 0으로 채워진 문자열로 형식화하여 0수행 됩니다. 그런 다음 해당 필드의 기존 데이터와 결합합니다.

이는 첫 번째 필드의 모든 짧은 문자열(단지 세 문자를 포함하는 문자열이 아님)에 적용됩니다.

문자열의 시작 부분을 0으로 채우는 것이 더 쉽습니다(필수는 아니지만 허용됨).

$ awk -F . 'BEGIN { OFS=FS } { $1 = sprintf("%.5d", $1) }; 1' file
46066.874.89
48569.123.56
56489.256.88
00654.12.32
84689.25.69

우리는 첫 번째 필드에 정수가 포함되어 있다는 사실을 활용하고 이를 sprintf()올바른 너비의 0으로 채워진 정수로 형식화합니다.

두 명령 모두 1끝에 있는 명령은 현재 줄을 인쇄하는 기본 작업을 호출합니다( { print }또는 로 대체 가능 { print $0 }).

관련 정보