Bash

sed 或 awk 獲取字元串

  • June 22, 2015

我有一個shell腳本

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

我想要介於name="和之間的值"/>是cluster1。此輸出應儲存到另一個變數。

對於您顯示的特定範例,所有這些都將保存cluster1在變數中$name

  1. sed
name=$(sed 's/.*="\(.*\)".*/\1/' <<<$string )
  1. GNU grep(編譯時支持 PCRE)
name=$(grep -oP '[^"]+(?="/>)'<<<$string )
  1. Perl
name=$(perl -pe 's/.*="(.*)".*/\1/' <<<$string )

如果您的 shall 不支持<<<運營商,請更改您首選的使用方法,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 解析器。

使用 GNU grep:

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

使用 GNU sed:

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

輸出:

集群1

引用自:https://unix.stackexchange.com/questions/211375