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/
ただし、sub()は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 }
'
そして最後に、必要に応じて作業を分割して読みやすく効率的にする方法を1つ紹介します。
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 }
文字列リテラルはawkで2回解釈されるため(スクリプトが解釈されるときに1回、実行されるときにもう一度)、4 "\" sかかります。したがって、リテラルのバックスラッシュを取得するには、\の代わりに\\が必要です。
必要に応じて、match()と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 }
'
個人的には、エスケープ文字をいじり回すのが嫌いなので、match()/ 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)
}'