Awk不關心「特殊字符」。這在sed:
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 }
'
,但你實際上並不需要,因爲子(以測試/<jobResulsDir/
前面)纔會發生,如果RE存在,所以你可以將其縮寫爲:
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)
}'
對不起,我想全sed命令didnt貼:sed的「/ < jobResultsDir/s/<\/CommCellUser>'$ test' $ temp_dir/PreImageModeFile2.xml –
user12345
你必須告訴它它是代碼。 – choroba