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
を<
再分割して出力します。
フィールドは、区切り文字の間、テキストの先頭と最初の区切り記号の間、最後の区切り記号とテキストの終わりの間のテキストを記述します。元のテキストを使用すると、>
次のようになります。
<xml:attribute
{41c33a-4893b-3627a-617a}</xml:attribute
- 空の文字列
(区切り文字を省略) 次に、<
フィールド 2 で以下を使用して提供します。
{41c33a-4893b-3627a-617a}
/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解析ライブラリのいずれかを使用します。perl
python