파일은 다음과 같습니다(큰 줄 하나).
a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a; etc......
이제 텍스트를 자르고 5개의 세미콜론( )마다 줄 바꿈하려고 합니다. ;
그러면 다음과 같습니다.
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
etc....
어떻게 해야 하나요?
답변1
그리고 tr
그리고paste
tr ';' '\n' < semicolons | paste -d';' - - - - -
시험
$ cat semicolons
a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a
$ tr ';' '\n' < semicolons | paste -d';' - - - - -
a;a;a;a;a
a;a;a;a;a
a;a;a;a;a
a;a;a;a;a
a;a;a;a;a
a;a;a;a;a
a;a;a;a;a
a;a;a;a;a
a;a;a;a;a
둘 다tr
그리고paste
POSIX 표준에 지정되어 있습니다.
;
줄 끝에 필수 세미콜론을 추가하세요.
tr ';' '\n' < semicolons | paste -d';' - - - - - | sed s/$/\;/
시험
$ tr ';' '\n' < semicolons | paste -d';' - - - - - | sed s/$/\;/
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
답변2
순수하게 GNU sed
대체품을 사용합니다:
sed 's/\(\([^;]*;\)\{5\}\)/\1\n/g'
또는 모든 백슬래시를 이스케이프 처리하지 않고 -E
(@JoL에게 감사드립니다):
sed -E 's/(([^;]*;){5})/\1\n/g'
예:
$ cat test.txt
a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a; etc......
$ cat test.txt | sed 's/\(\([^;]*;\)\{5\}\)/\1\n/g'
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a;a;
a;a;a;a; etc......
설명하다:
\([^;]*;\)
: 정규식 캡처 그룹은 모든 문자(세미콜론 포함)와 일치합니다.\(\([^;]*;\)\{5\}\)
: 위의 5개 항목과 일치하는 그룹을 캡처하는 정규식입니다.sed
명령 에서 이는 와 일치합니다\1
.s/\(\([^;]*;\)\{5\}\)/\1\n/g
: 세미콜론( )을 포함한 모든 문자의 5개 항목을s/
각각 자체( )로 바꾸고 그 뒤에 개행 문자( )가 옵니다./g
\(\([^;]*;\)\{5\}\)
\1
\n
답변3
Sed 편집기 방법 5번째 세미콜론 뒤에 개행 문자를 넣고, 개행 문자로 인쇄하고, 개행 문자까지 삭제하고, 패턴 공간이 다 사용될 때까지 n 반복을 플러시합니다.
$ sed -e 's/;/;\n/5;P;D' file
Perl을 사용하여 세미콜론을 필드 구분 기호로 사용하고 세미콜론을 OFS로 사용하고 끝에 빈 필드를 사용하여 후행 세미콜론을 인쇄하는 5 문자열로 인쇄합니다.
$ perl -F\; -lane '$,=";";
print splice(@F, 0, 5), q() while @F;
' file
Awk를 사용하여 5개 필드 묶음을 살펴보고 처음 4개 필드 뒤에 세미콜론을 추가하고 다섯 번째 필드 뒤에 세미콜론 + 개행 문자를 추가합니다. 그런 다음 필드를 인쇄하고 null로 구분합니다.
$ awk -F\; -vOFS= '{
for(i=1; i<=NF; i++)
$(i) = $(i) (i%5 ? FS : FS RS)
}1' file
답변4
이러한 유형의 작업에는 정규식이 적합하지만 시각적 지원과 단순성을 위해 이 작업에는 항상 텍스트 편집기 매크로를 사용합니다.
vim을 사용하면 다음과 같은 작업을 수행할 수 있습니다.
set textwidth=20
또는 이와 유사한 낮은 금액
set wrap
파일을 편집해야 하는 경우 간단한 매크로를 사용할 수 있습니다.
qqf;f;f;f;f;i\n99999@q
그렇게 할 것이다.