文字列の中間部分を返すには、cutを使用します。

文字列の中間部分を返すには、cutを使用します。

stdout次のようにエコーされたXML文字列があります。

<xml:attribute>{41c33a-4893b-3627a-617a}</xml:attribute>

{41c33a-4893b-3627a-617a}この場合、文字列を返したいと思います。カットを使用しようとしていますが(パイプを2回行うこともできます)、正しい構文がわかりません。バッシュを使っています。

答え1

cut区切り文字を定義するために使用できるオプション-d(結果フィールドを除く):

echo "<xml:attribute>{41c33a-4893b-3627a-617a}</xml:attribute>" | cut -d\> -f2 | cut -d\< -f1

これは>、2番目のフィールドを分割して出力し、そのままにしてから、最初のフィールド{41c33a-4893b-3627a-617a}</xml:attribute<再分割して出力します。

フィールドは、区切り文字の間、テキストの先頭と最初の区切り記号の間、最後の区切り記号とテキストの終わりの間のテキストを記述します。元のテキストを使用すると、>次のようになります。

  1. <xml:attribute
  2. {41c33a-4893b-3627a-617a}</xml:attribute
  3. 空の文字列

(区切り文字を省略) 次に、<フィールド 2 で以下を使用して提供します。

  1. {41c33a-4893b-3627a-617a}
  2. /xml:attribute

フィールド1はあなたが探している結果です。

答え2

単純な文字列操作の場合、通常は次のようなシェル独自の構成を使用する必要があります。パラメータ拡張。外部ユーティリティは大量のテキストを処理するのに適していますが、単一の文字列の場合、外部ツールの実行が遅く、正しく引用できない場合があります。

mystring='<xml:attribute>{41c33a-4893b-3627a-617a}</xml:attribute>'
content="${mystring#*>}"; content="${content%<*}"
braced="${mystring#*\{}"; braced="${braced%%\}*}"; braced="{$braced}"

content前部と後部を除く元の文字列に設定します<…>braced最初の部分のように見えるように設定します{…}

答え3

sed正規表現で指定されたフィールドを抽出することもできます。より複雑な一致条件がある場合に便利です。

echo '<xml:attribute>{41c33a-4893b-3627a-617a}</xml:attribute>' | \
sed -E 's/^.+>({.+})<.+$/\1/'

答え4

またはを使用するか、フィールド区切り文字として正規awk表現を使用します。<|>

$ echo "<xml:attribute>{41c33a-4893b-3627a-617a}</xml:attribute>" | 
       awk -F '<|>' '{print $3}'
{41c33a-4893b-3627a-617a}

注: GNU とawkテストmawkされていますoriginal-awk。動作原理は3つすべて同じです。

このperlバージョンは非常に似ています(perl配列がゼロから始まり明示的に指定されていない限り、ステートメントが末尾を出力しないperlことprintを除いて)。\n

echo "<xml:attribute>{41c33a-4893b-3627a-617a}</xml:attribute>" |
     perl -n -a -F'<|>' -e 'print $F[2],"\n"'

また参考にしてください。これは単一のXMLフラグメントを含む単一の入力行であるため、安定して動作します。正規表現は、実際のXMLを確実に解析するためには使用できません。たとえば、XML解析ツールを代わりに使用するか、、、およびその他の言語用xmlstarletの多くのXML解析ライブラリのいずれかを使用します。perlpython

関連情報