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
? 아마도 그렇지 않을 것입니다.