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"/二重引用符で囲まれた3番目のサブ式文字列(「LP173100-1」、2番目のサブ式文字列、3番目のサブ式文字列、二重引用符の順)を出力します。
  • 6{...};6行目は中括弧の間のコマンドのみを適用します
  • G;予約済みスペースをパターンスペースに追加します。注 – 以下を使用すると、先行スペースが失われます。x
  • s///パターン空間で実際の検索/置換を実行する
  • \(owl:Class\)文字列 "owl:space" のパターン空間を検索します。一致するサブ式は \1 を逆参照して呼び出すことができます。
  • \(.*org\/\)前述のように、 "rdf:about="https://loinc.org/" と一致する場合、逆参照は \2 です。
  • \(LP.*\)前述のように「LP173100-1」と一致し、逆参照は\ 3です。
  • /"\3"/二重引用符の間に3番目のサブ式文字列を出力します。

これを行うために使用できる他の方法はありますかsed?完全に。これが最も効率的な方法ですかsed?おそらくそうではありません。

おすすめ記事