파일에서 특정 문자열이 발견될 때마다 두 줄을 병합하고 싶습니다.
입력 예:
{
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
만드는$!N
등line2\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
옵션을 지원하지 않으므로 변경하려면 출력을 리디렉션해야 합니다.
시도 해봐