2012-11-22 4 views
0

안녕하세요 저는 쉘 스크립트를 사용하여 XML 태그 값 (특수 문자가 포함될 수 있음)을 설정하지 않았습니다.쉘 스크립트를 통해 XML 태그 설정

XML 태그 값은 큰 따옴표로 묶어야합니다.

요구 사항 : XML 태그 값이 있습니다. 쉘 스크립트의 경우 태그 앞에 값이 인 새 XML 태그를 추가해야합니다. ? 는 그래서 $ 4 $ (5) 나던 괜찮나 특수 문자와이 일을하는 특수 문자가있는 경우 below.This 잘 작동처럼 시도는이 나오지 사용하고 (. : &> < : 예를 "; '등)

그렇다 나오지에서
sed '/<jobResulsDir/s/<jobResulsDir/<CommCellUser userName="'$4'" password="'$5'" > <\/CommCellUser> '$test' <jobResulsDir /' $temp_dir/PreImageModeFile.xml > $temp_dir/PreImageModeFile2.xml 

펄을 사용하지 왜 나에게

+0

죄송합니다 내가 생각 붙여 전체 나오지 명령을 didnt : 나오지도 '/ < "$ test" $ temp_dir/PreImageModeFile2.xml user12345

+0

그래서 코드를 말해야합니다. – choroba

답변

0

awk는 "특수 문자"에 신경 쓰지 않습니다. 이것은에 나오지 :

sed '/<jobResulsDir/s/<jobResulsDir/<CommCellUser userName="'$4'" password="'$5'" > <\/CommCellUser> '$test' <jobResulsDir /' 

는 AWK이 있습니다 :

awk -v userName="$4" -v password="$5" -v test="$test" ' 
    /<jobResulsDir/{ sub(/<jobResulsDir/, "<CommCellUser userName=" userName " password=" password " </CommCellUser> " test " <jobResulsDir ") } 
    { print } 
' 

하지만 RE 그래서 당신이 존재하는 경우 실제로에만 발생합니다), 서브 (때문에 앞까지 /<jobResulsDir/을 테스트 할 필요가 없습니다 이 의견/질문은 질문 있지만 값 이름 주위에 따옴표를 필요로하는 경우, 당신이 그들을 필요로하는 곳에 그들을 제공하는 스크립트를 조정할 수 있었는지의 경우

awk -v userName="$4" -v password="$5" -v test="$test" ' 
    { sub(/<jobResulsDir/, "<CommCellUser userName=" userName " password=" password " </CommCellUser> " test " <jobResulsDir "); print } 
' 

확실하지 :로 축약 할 수 있습니다 :

awk -v userName="$4" -v password="$5" -v test="$test" ' 
    { sub(/<jobResulsDir/, "<CommCellUser userName=\"" userName "\" password=\"" password "\" </CommCellUser> \"" test "\" <jobResulsDir "); print } 
' 

그리고 마지막으로, 여기에 좀 더 읽기 쉽고 만약 당신이 좋아하면 더 효율적으로 작업을 분할 할 수있는 하나의 방법 :

awk -v userName="$4" -v password="$5" -v test="$test" ' 
    BEGIN{ 
     q = "\"" 
     rep = \ 
     "<CommCellUser userName=" q userName q\ 
     " password="    q password q\ 
     " </CommCellUser> "  q test  q\ 
     " <jobResulsDir " 
    } 
    { sub(/<jobResulsDir/, rep); print } 
' 

그리고 그것을보고 그런 식으로 배치 내가 내가 거짓말을 실현 awk가 "특수 문자"에 신경 쓰지 않는 것에 대해서는 거의 없습니다.sub()는 실제적으로 1 "특수 문자"에 대해 신경 쓰고 대체 문자열에 "&"이있는 것은 sub()에서 일치하는 것을 역 참조하는 데 사용되므로 "&"을 "\ &"으로 대체해야합니다. 담당자 : 그것은 소요

awk -v userName="$4" -v password="$5" -v test="$test" ' 
    BEGIN{ 
     q = "\"" 
     rep = \ 
     "<CommCellUser userName=" q userName q\ 
     " password="    q password q\ 
     " </CommCellUser> "  q test  q\ 
     " <jobResulsDir " 
    } 
    { gsub(/&/,"\\\\&",rep); sub(/<jobResulsDir/, rep); print } 

4 "\"의 문자열 리터럴은 AWK에 두 번 해석 얻을 때문에 (스크립트가 해석되고 다시 한번 실행 때) 당신이 필요로 리터럴 백 슬래시를 얻을 수 있도록 대신 \의 \ \.

원하는 경우 그 제약이없는 경기() 및 SUBSTR를 (사용하여 다른 방법)이있다 :

awk -v userName="$4" -v password="$5" -v test="$test" ' 
    BEGIN{ 
     q = "\"" 
     rep = \ 
     "<CommCellUser userName=" q userName q\ 
     " password="    q password q\ 
     " </CommCellUser> "  q test  q\ 
     " <jobResulsDir " 
    } 
    match($0,/<jobResulsDir/) { 
     $0 = substr($0,1,RSTART) rep substr($0,RSTART+RLENGTH) 
    } 
    { print } 
' 

개인적으로, 나는 (경기에 가고 싶어)/SUBSTR()는 나는 이스케이프 문자로 주변을 어지럽히는 것이 싫기 때문에 접근했다. 만약 당신이 좋아하면

그리고 단지 우리가 시작한 곳으로 다시 순환 라운드

, 여기 당신이 한 줄 같은 것을 쓸 수 방법은 다음과 같습니다

awk -v userName="$4" -v password="$5" -v test="$test" '{ 
    print (match($0,/<jobResulsDir/) ? substr($0,1,RSTART) "<CommCellUser userName=\"" userName "\"password=\"" password "\" </CommCellUser> \"" test "\" <jobResulsDir " substr($0,RSTART+RLENGTH) : $0) 
}' 
+0

잘 작동 해 주셔서 감사합니다 :) :). 심지어 나는 똑같은 가치를 얻는데 박차를 가하고 있습니다. 사용자 이름과 암호가 지금 설정되어 있습니다. xml 파일을 읽고 값을 다시 따옴표로 묶어야한다면 어떻게 할 수 있습니까? (값에 특수 문자가 포함되어 있습니다) – user12345

+0

미안하지만, 당신이 무엇을 요구하고 있는지 전혀 모르겠습니다. 원래 게시물이 업데이트되어 일부 작은 샘플 입력 (wget 명령의 출력 포함) 및 예상 결과가 표시되거나 원래의 문제가 해결 된 후에 새로운 질문을 더 잘 게시 할 수 있습니다. –

+0

ok :) 도움을 주셔서 감사합니다. – user12345

0

도움 호야 다른 방법이가? 그것은 쉘 스크립트로 가지고있다.

#!/usr/bin/perl 
    use XML::Simple; 
    use Data::Dumper; 
    open(my $XML_IN, '<', '/xml/file/path.xml'); 
    $/=undef; 
    my $xml_ref = XMLIn(<$XML_IN>); 
    print Dumper \$xml_ref; 
    # ... access $xml_ref in appropriate location, adding element/value 
    my $new_xml = XMLout($xml_ref); 
    close $XML_IN; 
    open(my $XML_OUT, '>', '/xml/file/path.xml'); 
    print $XML_OUT $new_xml; 
    close $XML_OUT; 
+0

예, 쉘 스크립트와 관련이 있습니다. – user12345

0

이 나오지 의지 할 려 너의 두뇌를 찢어 버리면 뒷골목을 사용해야한다. 모든 특수 문자 앞에 h를 붙이면 작동합니다. 나는 이런 종류의 작업을 위해 m4를 사용한다. 예를 들어보기 :라는 이름의 파일에 위의 코드 저장

define(your_macro_name,<Delete> 
<Object fdn="SubNetwork=somemoredata`,SubNetwork=somedata'`,ManagedElement'=$1"/> 
</Delete>)dnl 

을 "xmlmacros.m4" 다음라는 파일 "test.m4"을 만들고 다음을 추가 내용 :

include(xmlmacros.m4)dnl 
your_macro_name(YOURXMLVALUE) 

경우] 두 파일이 같은 폴더에, 당신은 m4 test.m4를 실행할 수와 출력은 다음과 같습니다 $1가 parenthe의 값으로 대체됩니다

<Delete> 
<Object fdn="SubNetwork=somemoredata,SubNetwork=somedata,ManagedElement=YOURXMLVALUE"/> 

"test.m4"파일의 sis. 더 많은 정의를 추가하여 xml 헤더와 같은 필요에 따라 xml 파일을 만들 수 있습니다.

위의 예제는 사용할 수있는 작동 예제입니다. m4에 대한 자세한 정보는 주위를 둘러 볼 수 있으며, 항상이 유형의 작업에 사용합니다.

+0

주어진 예제에서 명령 출력은 닫는 XML 태그로 끝납니다 : '' – Arribah

관련 문제