sed 여러 줄 교체

sed 여러 줄 교체

owl:Class아래 텍스트를 LP 번호로 바꿔야 합니다 .

입력하다:

<owl:Class rdf:about="https://loinc.org/LP173100-1">
        <rdfs:subClassOf rdf:resource="https://loinc.org/LP410935-3"/>
        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Counseling (LP)</rdfs:label>
        <skos:prefLabel rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Counseling</skos:prefLabel>
        <loinc:hasCode rdf:datatype="http://www.w3.org/2001/XMLSchema#string">LP173100-1</loinc:hasCode>
    </owl:Class>

교체 후의 출력은 다음과 같습니다

산출:

<"LP173100-1" rdf:about="https://loinc.org/LP173100-1">
        <rdfs:subClassOf rdf:resource="https://loinc.org/LP410935-3"/>
        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Counseling (LP)</rdfs:label>
        <skos:prefLabel rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Counseling</skos:prefLabel>
        <loinc:hasCode rdf:datatype="http://www.w3.org/2001/XMLSchema#string">LP173100-1</loinc:hasCode>
    </"LP173100-1">

첫 번째 행 에 사용했는데 s/\(owl:Class\)\(.*org\/\)\(LP.*\)"/"\3"\2\3/g마지막 행에 어떻게 적용해야 할지 모르겠습니다. 더 우아한 솔루션이 있습니까? 이런 유형의 교체를 수행해야 하는 대용량 파일이 있습니다.

CentOS 7.7 시스템을 사용하고 있습니다.

답변1

GNU를 사용하고 sed파일에 예제의 6줄만 포함되어 있다고 가정합니다.

$ sed -e '1{h; s/\(owl:Class\)\(.*org\/\)\(LP.*\)"/"\3"\2\3"/}; 6{G; s/\(owl:Class\)\(.*org\/\)\(LP.*\)"/"\3"/}'  infile
<"LP173100-1" rdf:about="https://loinc.org/LP173100-1">
      <rdfs:subClassOf rdf:resource="https://loinc.org/LP410935-3"/>
      <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Counseling (LP)</rdfs:label>
      <skos:prefLabel rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Counseling</skos:prefLabel>
      <loinc:hasCode rdf:datatype="http://www.w3.org/2001/XMLSchema#string">LP173100-1</loinc:hasCode>
   </"LP173100-1">
$

설명하다:

정규식 패턴에서 역참조는 이전에 일치된 하위 표현식과 동일한 콘텐츠를 일치시키는 데 사용됩니다.

패턴 공간은 sed가 입력 파일에서 읽은 행을 배치하고 수정할 수 있는 sed의 내부 버퍼입니다.

예약된 공간은 sed가 임시 데이터를 저장할 수 있는 추가 내부 sed 버퍼입니다.

  • 1{...};중괄호 사이의 명령만 첫 번째 줄에 적용합니다.
  • h;공간을 수용할 수 있도록 패턴 공간, 즉 수정되지 않은 첫 번째 줄을 저장합니다.
  • s///패턴 공간에서 실제 검색/바꾸기 수행
  • \(owl:Class\)문자열 "owl:space"에 대한 패턴 공간을 검색합니다. 일치하는 하위 표현식은 \1을 역참조하여 호출할 수 있습니다.
  • \(.*org\/\)언급한 대로 "rdf:about="https://loinc.org/"와 일치하면 역참조는 \2입니다.
  • \(LP.*\)앞에서 언급했듯이 "LP173100-1"과 일치하며 역참조는 \3입니다.
  • /"\3"\2\3"/큰따옴표로 묶인 세 번째 하위 표현식 문자열("LP173100-1", 두 번째 하위 표현식 문자열, 세 번째 하위 표현식 문자열, 큰따옴표 순)을 출력합니다.
  • 6{...};6번째 줄에는 중괄호 사이의 명령만 적용
  • G;예약된 공간을 패턴 공간에 추가합니다. 참고 - 다음을 사용하면 선행 공백이 손실됩니다.x
  • s///패턴 공간에서 실제 검색/바꾸기 수행
  • \(owl:Class\)문자열 "owl:space"에 대한 패턴 공간을 검색합니다. 일치하는 하위 표현식은 \1을 역참조하여 호출할 수 있습니다.
  • \(.*org\/\)앞서 언급했듯이 "rdf:about="https://loinc.org/"와 일치하면 역참조는 \2입니다.
  • \(LP.*\)앞에서 언급했듯이 "LP173100-1"과 일치하며 역참조는 \3입니다.
  • /"\3"/큰따옴표 사이에 세 번째 하위 표현식 문자열을 출력합니다.

이 작업을 수행하는 데 사용할 수 있는 다른 방법이 있습니까 sed? 전적으로. 이것이 가장 효율적인 방법인가요 sed? 아마도 그렇지 않을 것입니다.

관련 정보