与えられた変数> <の間のテキストを見つけて、テキストを別のものに変更します。

与えられた変数> <の間のテキストを見つけて、テキストを別のものに変更します。

たとえば、ファイルを検索すると。 s_webdomainのfile.xmlは次のとおりです。

        <hostname oa_var="s_webhost">hostname</hostname>
     <externURL oa_var="s_external_url">https://hostname:4450</externURL>
     <directory_index oa_var="s_directory_index">index.html</directory_index>
     <webentryhost oa_var="s_webentryhost">hostname.host</webentryhost>
     <webentrydomain oa_var="s_webentrydomain">services.uk</webentrydomain>
     <domain oa_var="s_webdomain">services.uk</domain>
     <server_ip_address oa_var="s_server_ip_address"/>
     <!-- Configuration files -->
     <!-- SSL Variables -->
     <url_protocol oa_var="s_url_protocol">http</url_protocol>
     <web_ssl_directory oa_var="s_web_ssl_directory">/u03/app/ENV/gs/inst/ENV_01-bsapp01/certs</web_ssl_directory>
     <local_url_protocol oa_var="s_local_url_protocol">http</local_url_protocol>

私はservices.ukを置き換えたいと思います。

<domain oa_var="s_webdomain">SOME_DIFFERENT_TEXT</domain>

$ grep s_webdomain file.xml | awk -F '>' '{print $2}' | awk -F '<' '{print $1}'

イギリスサービスネットワーク

services.ukをSOME_DIFFERENT_TEXTに変更する方法についてのアイデアはありますか? sedコマンドが必要な場合がありますが、わかりません。

ありがとうございます。

ベストアンサー1

構造化文書形式の文書を扱うときに最適な処理ツールは、その形式を認識するツールです。

以下は、XML処理ツールを使用して、すべてのノードの値を属性xmlstarletとして値に置き換えます。domainou_vars_webdomain

xmlstarlet edit \
    --update '//domain[@oa_var = "s_webdomain"]' \
    --value "SOME_DIFFERENT_TEXT" file

または短いオプションを使用してください。

xmlstarlet ed \
    -u '//domain[@oa_var = "s_webdomain"]' \
    -v "SOME_DIFFERENT_TEXT" file

このコマンドは、XPathクエリを使用して//domain[@oa_var = "s_webdomain"]更新される入力文書内の可能なすべての場所を指定します。一致する各エンティティの値は(この場合)文字列で更新されますSOME_DIFFERENT_TEXT

Xpathパターンの最初の文字は、ノードを見つけることができること//を示します。domainどこかに。一般に、人々は文書の構造を知っており、処理するノードへのより正確なパスを指定します。

文書を「所定の位置」に変更するには、後ろに--inplace-L)を追加します。edit

たとえば、複数のノードに影響を与えるには、webentrynode値は次のとおりです。oa_vars_webentrydomain

xmlstarlet edit \
    --update '//domain[@oa_var = "s_webdomain"]' \
    --value "SOME_DIFFERENT_TEXT" \
    --update '//webentrydomain[@oa_var = "s_webentrydomain"]' \
    --value "SOME_DIFFERENT_TEXT" file

到着タブレット使用できる値はxmlstarlet select次のとおりです。

xmlstarlet select \
    --template \
    --value-of '//domain[@oa_var = "s_webdomain"]' \
    -nl file

または短いオプションを使用してください。

xmlstarlet sel -t -v '//domain[@oa_var = "s_webdomain"]' -n file

おすすめ記事