파일의 문자열이 일치할 때마다 줄 병합

파일의 문자열이 일치할 때마다 줄 병합

파일에서 특정 문자열이 발견될 때마다 두 줄을 병합하고 싶습니다.

입력 예:

{
    id: 23281598
      total: {
        value: 3.0
      }
      isThin: false
      raw: {
        value: 6.0
      }
    }
    total: {
      value: 1.401326182E9
    }
    Pools: {
      value: 8.98886247E8

원하는 출력:

{
    id: 23281598
      total: { value: 3.0
      }
      isThin: false
      raw: { value: 6.0
      }
    }
    total: { value: 1.401326182E9
    }
    Pools: { value: 8.98886247E8

아시다시피 패턴을 찾을 때마다 value:파일의 이전 줄과 결합하고 싶습니다. 각 줄의 선행 공백을 제거하면 나에게 효과적입니다. 필요 awk하거나 sed해결책이 있습니다. 입력 파일에는 고정된 패턴이 없습니다. 포함된 줄은 value:어디에나 나타날 수 있지만 연속적으로 나타날 수는 없습니다.

솔라리스 5.10을 사용합니다.

답변1

앞쪽:

LC_ALL=C sed -e '$!N;/value:/b1' -e 'P;D' -e:1 -e 's/\n[[:space:]]*/ /' <file

매우 간단합니다:

  • $!N: 마지막 줄을 제외한 각 줄에 대해 다음 줄을 읽습니다.
  • /value:/b1: 패턴이 일치하면 이름이 붙은 브랜치로 이동1
  • P;D: 패턴이 일치하지 않으면 현재 줄을 인쇄하고 $!N위에서 줄을 읽어 새 루프를 시작합니다. 따라서 가 있으면 line1\nline2인쇄하고 line1로 새 루프를 시작하고 line2만드는 $!Nline2\nline3의 작업을 수행합니다.
  • :1: 이름이 지정된 분기를 정의합니다.1
  • 's/\n[[:space:]]*/ /': 분기에서 1포함된 줄바꿈과 선행 공백을 단일 공백으로 바꿉니다.

답변2

작업을 단순하게 유지하세요.

sed 'N;s/\n[[:space:]]*value:/ value:/;P;D'

N;P;D항상 두 행을 동시에 처리하는 루프를 실행합니다 ( $!여기서는 필요하지 않습니다). 내부에서 개행 문자를 공백으로 바꾼 다음 value:공백으로 바꿉니다. 그게 다야.

답변3

sed다음을 사용해 볼 수도 있습니다.

sed -e '/: {$/{N;s/\n//g}' -e 's/{.*v/{ v/g' file

설명하다:

  • /시작 조건
  • : {$줄이 다음으로 끝나는 경우: {
  • /종료 조건
  • {액션 그룹 시작
  • N;다음 줄을 일치하는 줄에 연결하세요.
  • s/\n//g교체하다\n
  • }작업 그룹 종료

포맷된 출력 옵션

  • 's/{.*v/{ v/g'다른 표현식을 실행하여 {& (공백) v사이의 모든 항목을 단일 공백으로 바꿉니다.

내가 아는 바로는 Solaris는 -i옵션을 지원하지 않으므로 변경하려면 출력을 리디렉션해야 합니다.

시도 해봐

관련 정보