파일 작업은 텍스트 파일의 각 줄에 12, 44, 60자마다 ";"를 삽입합니다.

파일 작업은 텍스트 파일의 각 줄에 12, 44, 60자마다 ";"를 삽입합니다.

구분 기호 없이 데이터가 포함된 텍스트 파일에서 csv 파일을 만들어야 합니다.

좋다:

2015021DUMMY001EAN1377689456777678945GERDE0002345
2015031DUMMY002EAN1345647876867867867TURTR0154565
......

bash 또는 sed를 사용하여 각 줄의 모든 x, y 및 z 문자에 세미콜론을 삽입하는 쉬운 방법이 있습니까?

답변1

12자, 32자, 16자 그룹을 사용할 수 있습니다(12+32=44, 44+16=60).

sed 's/\(.\{12\}\)\(.\{32\}\)\(.\{16\}\)/\1;\2;\3/'

귀하의 예제 입력에는 60자가 포함되어 있지 않습니다(올바르게 계산하면 49자). 그렇지 않으면 12와 32만 사용됩니다.

$ sed 's/\(.\{12\}\)\(.\{32\}\)/\1;\2;/' input
2015021DUMMY;001EAN1377689456777678945GERDE00;02345
2015031DUMMY;002EAN1345647876867867867TURTR01;54565

...당신이 원하는 것일 수도 있고 아닐 수도 있습니다.

일반적으로 그룹의 길이는 x, yx 및 zyx 문자입니다.

또는 세 가지 별도의 대체품을 사용할 수 있습니다.

sed 's/.\{12\}/&;/; s/.\{45\}/&;/; s/.\{62\}/&;/'

이 경우 길이는 x, y+1(x에 삽입된 세미콜론) 및 z+2가 됩니다.

답변2

sed 's/./&;/59; s//&;/43; s//&;/11' <in >out

;당신이 원하는지 잘 모르겠어요한 줄의 12번째, 44번째 또는 60번째 문자 또는따르다그것. 후자인 경우 모든 숫자에 1을 추가하고 줄 끝에 세미콜론을 추가할 위험이 있습니다.(그게 중요하다면)또는 아래를 참조하세요. 단, 위에 적힌 대로 sed이미 59번째 문자가 없으면 60번째 문자는 추가되지 않습니다.

추가 대신 삽입을 수행합니다.

sed 's/./;&/60; s//;&/44; s//;&/12' <in >out

...다른 방법입니다. 이 경우 sed세미콜론은 줄 끝에 추가되지 않습니다. 세미콜론은 60번째 문자 위치에만 삽입됩니다.(예를 들어)그렇게 하면 반드시 61명이 될 것입니다.

이 세 가지 대체는 상호의존적이지 않습니다. 어떤 방식으로 작성하든 sed줄 길이에 따라 세미콜론 1개, 2개 또는 3개가 추가됩니다. 59자 또는 60자를 포함하는 줄은 3개를 갖게 되며, 42자 또는 43자보다 긴 짧은 줄은 세미콜론 2개를 갖게 되며, 11자 또는 12자 이상과 일치하는 다른 줄은 한 번만 편집됩니다. 11자보다 짧은 줄은 영향을 받지 않습니다.

세 개의 세미콜론을 모두 정당화할 수 있을 만큼 긴 줄에만 영향을 미치려면 다음을 수행하십시오.

sed  -e's/./;&/60;ts'  -eb -e:s \
     -e's//;&/44;s//;&/12' <in >out

...그럴 겁니다.

...GNU와 함께sed (그리고 minised)T대신 est를 사용할 수 있습니다 .실패하다단지 성공만을 위한 것이 아닙니다.

sed -e's/./&;/59;T; s//&;/43; s/&;/12' <in >out

관련 정보