패턴으로 시작하는 줄 끝에서 새 줄 바꾸기 [중복]

패턴으로 시작하는 줄 끝에서 새 줄 바꾸기 [중복]

내 Ubuntu 컴퓨터에 파일이 있고 "@"을 사용하여 특정 줄의 시작 부분을 표시했습니다.

@A
bbb
@B
bbb
@D
ccc

위 파일이 되도록 "@"으로 시작하는 줄 끝에서 새 줄을 제거하고 싶습니다.

@Abbb
@Bbbb
@Dccc

sed를 사용하여 @로 시작하는 줄을 일치시킬 수 있습니다.

sed /^@/ ...

그러나 문자열 끝에 있는 개행 문자를 제거하는 방법을 찾으려고 노력 중입니다. sed텍스트 편집기에서 파일을 수동으로 열고 직접 삭제할 필요 없이 이 작업을 쉽게 수행할 수 있는 방법이 있어야 합니다 .

답변1

$ printf '%s\n' 'g/^@/j' ',p' 'Q' | ed -s file
@Abbb
@Bbbb
@Dccc

위의 내용은 짧은 스크립트를 사용하여 ed정규식과 일치하는 파일의 각 줄을 그 뒤의 줄과 ^@연결합니다 . 그런 다음 편집 버퍼의 모든 행을 인쇄하고 저장하지 않고 종료합니다.


$ sed '/^@/ { N; s/\n//; }' file
@Abbb
@Bbbb
@Dccc

sed현재 줄이 일치하면 이 명령은 다음 줄을 입력 버퍼에 추가합니다 ^@. 삽입된 개행 문자가 제거되고 해당 행이 인쇄됩니다.

@두 변형 모두 해당 줄이 바로 다음에 오면 해당 줄로 시작하는 줄을 놓칩니다. 이는 그들이 다음으로 향할 것임을 의미합니다.

@1
@2
X
@3
Y

입력하다

@1@2
X
@3Y

대신에

@1@2X
@3Y

이것이 괜찮은지 불분명합니다.

답변2

Perl이 구출하러 옵니다!

perl -pe 'chomp if /^@/' -- file
  • -p입력된 내용을 한 줄씩 읽고 처리 후 각 줄을 인쇄합니다.
  • /^@/@줄의 시작 부분 과 일치합니다.
  • 씹다후행 줄 바꿈 제거

답변3

비 sed

  1. 모든 줄이 @와 @가 아닌 것을 번갈아 사용한다는 것을 알고 있다면,

    paste -d '' - - < file
    
  2. awk '{printf "%s%s", $0, (/^@/ ? "" : ORS)}' file
    

답변4

그리고 perl:

$ perl -pe 's/^(@.*)\n/\1/' file
@Abbb
@Bbbb
@Dccc

또는

$ perl -pe 's/\n// if /^@/' file
@Abbb
@Bbbb
@Dccc

관련 정보