sed: 정규식에 개행 문자를 삽입하는 방법은 무엇입니까?

sed: 정규식에 개행 문자를 삽입하는 방법은 무엇입니까?

텍스트 파일의 형식을 지정하려고 합니다. 이제 일반적으로 다음과 같습니다.

ApartCD 컴팩트 디스크 CD-ROM 컴팩트 디스크 읽기 전용 메모리 CD-RW 재기록 가능한 컴팩트 디스크 CDFS 컴팩트 디스크 파일 시스템 CERT 컴퓨터 비상 대응 팀 CFS 중앙 파일 시스템, 공통 파일 시스템 또는 명령 파일 시스템 ACRONYM SPELLED OUTCGA 컴퓨터 그래픽 및 응용 프로그램 CIDR Classless Inter -도메인 라우팅 CIFS 일반 인터넷 파일 시스템 CMOS 상보형 금속 산화물 반도체 CNR 통신 및 네트워킹 RiserCOMx 통신 포트(x=포트 번호) CPU 중앙 처리 장치 CRT 음극선관 DaaS 데이터 서비스 DAC 자율 액세스 제어 DB-25 직렬 통신 D- Shell Connect 서버, 25핀 DB-9 직렬 통신 D-Shell 커넥터, 9핀 DBaaS 서비스형 데이터베이스 DC DC DDoS 분산 서비스 거부 DDR 이중 데이터 속도 DDR RAM 이중 데이터 속도 랜덤 액세스 메모리 DFS 분산 파일 시스템 DHCP 동적 호스트 구성 프로토콜 DIMM 듀얼 인라인 메모리 모듈 DIN 독일 산업 사양 DLT 디지털 선형 테이프 DLP 디지털 광학 P

이것은 제가 복사한 예일 뿐입니다. 먼저, 소문자와 대문자 사이에 줄 바꿈을 삽입하고 싶습니다. 나는 GNU sed 매뉴얼을 읽음으로써 대괄호 범위를 사용하여 이 작업을 수행할 수 있다는 것을 알았습니다 [:lower:]( [:upper:]올바른 [[:lower:]]+[[:upper:]]패턴이라고 생각합니다). 그러나 이를 수행하기 위한 올바른 명령이나 일반적인 구문을 결정하지 않았습니다. 줄 바꿈을 추가하는 명령을 여러 개 찾았지만 정규식에 삽입하는 명령은 없습니다.

sed를 사용한 것은 이번이 처음입니다. 이것이 작업에 가장 적합한 도구인지 모르겠습니다. 도움을 주시면 대단히 감사하겠습니다. 별 문제가 아니라면 명령을 설명해 주시면 나중에 다른 사람을 괴롭히지 않고도 뭔가를 배울 수 있을 것입니다. 감사해요.

답변1

GNU sed를 사용하여 이것을 시도해 보세요:

$ sed 's/\([a-z]\+\)\([A-Z]\)/\1\n\2/g' text.txt 

귀하의 입력에 대해 다음이 생성됩니다.

s Apart
CD Compact Disc
CD-ROM Compact Disc-Read-Only Memory
CD-RW Compact Disc-Rewritable
CDFS Compact Disc File System
CERT Computer Emergency Response Team
CFS Central File System, Common File System, or Command File System
ACRONYM SPELLED OUTCGA Computer Graphics and Applications
CIDR Classless Inter-Domain Routing
CIFS Common Internet File System
CMOS Complementary Metal-Oxide Semiconductor
CNR Communications and Networking Riser
COMx Communication port (x=port number)CPU Central Processing Unit
CRT Cathode-Ray Tube
Daa
S Data as a Service
DAC Discretionary Access Control
DB-25 Serial Communications D-Shell Connector, 25 pins
DB-9 Serial Communications D-Shell Connector, 9 pins
DBaa
S Database as a Service DC Direct Current
DDo
S Distributed Denial of Service
DDR Double Data Rate
DDR RAM Double Data Rate Random Access Memory
DFS Distributed File System
DHCP Dynamic Host Configuration Protocol
DIMM Dual Inline Memory Module
DIN Deutsche Industrie Norm
DLT Digital Linear Tape
DLP Digital Light P

몇 가지 설명:

패턴을 이해했기 때문에 "캡처 그룹"이 무엇인지 알고 있다고 가정합니다.

문자열은 's/\([a-z]\+\)\([A-Z]\)/\1\n\2/g'문자별로 4부분으로 나뉩니다 /.

첫 번째 부분 s의 의미바꾸다.

두 번째 부분은 패턴입니다. 이 패턴에는 두 개의 캡처 그룹, [a-z]\+및 가 포함되어 있습니다 [A-Z]. 예를 들어, 귀하가 입력한 "DDoS"라는 단어를 생각해 보십시오. 첫 번째 캡처링 그룹은 "o"를 캡처하고 두 번째 캡처링 그룹은 "S"를 캡처합니다. 전체 패턴이 "oS"와 일치합니다.

세 번째 부분은 \1\n\2패턴과 일치하는 문자열을 대체합니다. "DDoS" 예에서 "o"인 \1첫 번째 캡처 그룹을 나타냅니다 . "DDoS" 예에서는 "S"인 두 번째 캡처 그룹을 나타냅니다 . 개행 문자를 나타냅니다. 따라서 이들을 결합하면 일치하는 문자열 "oS"를 대체하는 "o\nS"를 얻게 됩니다.[a-z]\+\2[A-Z]\n

네 번째 부분은 다음을 g의미합니다.글로벌. 생략하면 sed첫 번째 일치 항목을 찾아서 교체하고 종료합니다. 를 사용하면 g일치 sed하는 모든 문자열이 검색되어 교체됩니다.

당신은 참조 할 수 있습니다sed 매뉴얼상세 설명.

답변2

GNU는 sed다음 명령을 사용하여 s///개행 문자를 삽입 할 수 있습니다.

sed -e 's/\([[:lower:]]\)\([[:upper:]]\)/\1\n\2/g' file

비 GNU (예: macOS, BSD 및 기타 비 Linux 시스템)는 명령 대체 텍스트의 의미를 sed모르고 문자 만 삽입합니다 .\ns///n

개행 문자를 바꾸려면 다음과 같이 리터럴 개행 문자를 이스케이프 처리해야 합니다.

sed -e 's/\([[:lower:]]\)\([[:upper:]]\)/\1\
\2/g' file

또는 아직 데이터에 없는 추가 자리 표시자 문자를 삽입하고 y///이를 줄 바꿈으로 바꾸는 것과 같은 해결 방법을 사용하십시오( y///command comprehension \n).

sed -e 's/\([[:lower:]]\)\([[:upper:]]\)/\1@\2/g' -e 'y/@/\n/' file

또는

sed -e 's/\([[:lower:]]\)\([[:upper:]]\)/\1@\2/g' file | tr '@' '\n'

[[:lower:]]단일 문자와 일치하는 반면 ( [[:lower:]]+또는 [[:lower:]]\{1,\}기본 정규식으로 작성된 경우) 일치합니다.적어도캐릭터. 이 경우 +(or \{1,\})는 하나의 소문자와 일치하는 데 충분하므로 필요하지 않습니다.

관련 정보