한 줄에 두 패턴 사이에 인쇄

한 줄에 두 패턴 사이에 인쇄

다음 내용이 포함된 파일이 있습니다.

<alarm="yes">
<moduleId>aaa</moduleId>
<documentation>
<description>bbb</description>
<Object>ccc</Object>
</documentation>
</alarmSpecification>
<alarm="yes">
<moduleId>bbb</moduleId>
<documentation>
<description>abc</description>
<Object>xxx</Object>
</documentation>
</alarmSpecification>

패턴을 맞춰서 한 줄로 인쇄하고 싶어요. 여기서 모드는 알람&알람사양입니다. 출력은 다음과 같습니다.

<alarm="yes">,<moduleId>aaa</moduleId>,<documentation>,<description>bbb</description>,<Object>ccc</Object>,</documentation>,</alarmSpecification>
<alarm="yes">,<moduleId>aaa</moduleId>,<documentation>,<description>bbb</description>,<Object>ccc</Object>,</documentation>,</alarmSpecification>

구현 방법을 안내해 주세요.

답변1

이는 유효한 XML이 아닌 것 같으므로 다음과 같은 일반 텍스트 처리를 사용하는 것이 더 좋습니다 sed.

sed 'H;/<alarm=/h;/<\/alarmSpecification>/!d;g;s/\n/,/g'
  • HH기존 공간 에 행 추가
  • /<alarm=/h<alarm새 필드에서 수집된 행을 재설정합니다.
  • /<\/alarmSpecification>/!d경고가 아닌 경우 지정된 라인에서 중지
  • 그렇지 않으면 예약된 공간에 수집된 ilnes가 g줄 바꿈 으로 대체됩니다.,s/\n/,/g

답변2

사용 awk:

$ awk '/<alarm/,/<\/alarmSpecification/{ORS = (/<\/alarmSpecification>/) ? "\n" : "," ;print}' file

답변3

이는 실제로 XML 파서를 사용하여 수행되어야 합니다. 아래 솔루션은 귀하의 예에서는 작동하지만 약간 더 복잡한 경우에는 실패합니다. XML과 같은 복잡한 형식을 구문 분석하기 위해 여기서 제안하는 것과 같은 간단한 방법을 사용하는 것은 좋은 생각이 아닙니다. 그렇긴 하지만, 이것은 보여주신 구체적이고 간단한 예에서만 작동이 보장되는 보기 흉하고 깨지기 쉬운 접근 방식입니다.

$ perl -ne '$k=1 if /<alarm=/; $k=0 if /<\/alarmSpecification>/; s/\n/,/ if $k; print $k ? $_ : "\n"; ' file | sed 's/,$//'
<alarm="yes">,<moduleId>aaa</moduleId>,<documentation>,<description>bbb</description>,<Object>ccc</Object>,</documentation>
<alarm="yes">,<moduleId>bbb</moduleId>,<documentation>,<description>abc</description>,<Object>xxx</Object>,</documentation>

답변4

GNU awk를 사용하는 다중 문자 RS:

$ awk -v RS='</alarmSpecification>\n' -v ORS= -F'\n' -v OFS=',' '{$NF=$NF RT} 1' file
<alarm="yes">,<moduleId>aaa</moduleId>,<documentation>,<description>bbb</description>,<Object>ccc</Object>,</documentation>,</alarmSpecification>
<alarm="yes">,<moduleId>bbb</moduleId>,<documentation>,<description>abc</description>,<Object>xxx</Object>,</documentation>,</alarmSpecification>

관련 정보