정규식 일치 전에 개행\개행 제거

정규식 일치 전에 개행\개행 제거

현재 간단한 텍스트 파일을 구문 분석하기 위해 bash 스크립트를 작성 중입니다. 지금 내가 겪고 있는 문제는 있어서는 안 될 새로운 줄이 나타난다는 것입니다. 예를 들어보겠습니다

Q1bcd    3 - 4 ---   ---  ---     Ba     Klasse hat Aufgab..
8 a     3    ---        ---     Mr
6 b      3 - 4 ---   ---  ---     Bu     Unterricht im
Klassenverband
8 a     4    ---        ---     Ke
7 a      4    De   Bi   r24    La

"Klassenverband" 문자열이 새 줄에 있습니다. 나는 이것을 원하지 않습니다. 새 줄 문자를 제거하기 위해 sed 및 awk를 사용하여 다른 명령을 실행해 보았습니다.

awk '/^\([a-zA-Z]\{4\}\)/{printf "%s ",$0;next} 1' file
sed '/^\([a-zA-Z]\{4\}\)/{N;s/\n//;}' file

지금까지 내가 생각한 것은 다음 정규식을 사용하여 필요한 모든 문자열을 추출할 수 있다는 것입니다.

^\([a-zA-Z]\{4\}\)

나는 이런 결과를 기대하고있다

Q1bcd    3 - 4 ---   ---  ---     Ba     Klasse hat Aufgab..
8 a     3    ---        ---     Mr
6 b      3 - 4 ---   ---  ---     Bu     Unterricht im Klassenverband
8 a     4    ---        ---     Ke
7 a      4    De   Bi   r24    La

편집하다: 이것은 나에게 효과적입니다. 하지만 텍스트 파일은 DOS 파일이 아닌 Unix 텍스트 파일이어야 합니다.

sed '$!N; s/\n\([[:alpha:]]\{4,\}\)/ \1/; P;D' file

답변1

어때요?

sed '$!N; s/\n\([[:alpha:]]\{4,\}\)/ \1/; P;D' file
Q1bcd    3 - 4 ---   ---  ---     Ba     Klasse hat Aufgab..
8 a     3    ---        ---     Mr
6 b      3 - 4 ---   ---  ---     Bu     Unterricht im Klassenverband
8 a     4    ---        ---     Ke
7 a      4    De   Bi   r24    La

답변2

의 경우 perl입력 파일이 메모리에 들어갈 만큼 작다고 가정합니다.

perl -0777 -pe 's/\n([a-zA-Z]{4})/ $1/g' file.txt

답변3

이것은 서투른 일입니다. 아마도 더 좋은 방법이 있을 것입니다.

awk '{ c=""; if (NR!=1 && !/^[a-zA-Z]{4}/) { c="\n" }; printf("%s%s",c,$0) } END { print "" }' 

기본적으로 각 줄을 인쇄합니다.아니요LF 캐릭터. 그럼 우리는 할 수 있어접두사이 줄을 병합하지 않으려면 다음 줄에 LF를 추가하세요.

마지막으로 이는 마지막 줄에 마지막 LF가 누락되었음을 의미하므로 추가합니다.

관련 정보