文字列を取得するには sed または awk

文字列を取得するには sed または awk

シェルスクリプトがあります

string=<deploymentTargets xmi:type="appdeployment:ClusteredTarget" xmi:id="ClusteredTarget_143378365
7353" name="cluster1"/>

name="との間で私が望む値は"/>Cluster1です。この出力は他の変数に保存する必要があります。

答え1

GNU grepを使用してください:

a="$(grep -oP 'name="\K[^"]*(?="/>)' file)"
echo "$a"

GNU sedの使用:

a="$(sed -E 's|.*name="([^"]*)"/>.*|\1|' file)"
echo "$a"

出力:

クラスタ1

答え2

示された特定の例では、これらはすべてcluster1変数に保存されます$name

  1. sed

    name=$(sed 's/.*="\(.*\)".*/\1/' <<<$string )
    
  2. GNU grep(PCREサポートでコンパイル済み)

    name=$(grep -oP '[^"]+(?="/>)'<<<$string )
    
  3. パール

    name=$(perl -pe 's/.*="(.*)".*/\1/' <<<$string )
    

あなたがこの<<<キャリアをサポートしてはいけない場合は、好みの方法を変更するか、printf代わりechoに次のものを使用してください。

name=$(printf '%s' "$string" | sed 's/.*="\(.*\)".*/\1/')
name=$(printf '%s' "$string" | grep -oP '[^"]+(?="/>)')
name=$(printf '%s' "$string" | perl -pe 's/.*="(.*)".*/\1/')

重要:これだろうただ表示された例に従ってください。ネストされたタグなどを含むより複雑なXML構造の場合は、専用のXMLパーサーを使用する必要があります。

関連情報