문자열을 얻으려면 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 파서를 사용해야 합니다.

관련 정보