あなたの助けを求めてください。
私はたくさん見つけて、awkとsedを使っていくつかのテストをしましたが、うまくいきません。以下は設定ファイルの一部です。 grepを介して出力を取得できますが、必要な方法ではありません。
> file.txt
>
> "<property>name="DBName"><value>ABC</value>name="DBName"><value>DEF</value></property>
>
> cat file.xml | grep -o -P '.name="DBName"><value>.{0,20}'
> name="DBName"><value>ABC</value>
> name="DBName"><value>DEF</value></propert
希望の出力は次のとおりです。
ABC
DEF
助けてくれてありがとう。
そして私
答え1
(巨大で巨大な「if」)あなたのファイルが実際にあなたが望む非常に単純な場合のみを持っている場合精密文字列<value>
の後には-文字以外の文字が続きます。したがって、<
質問は「</value>
各項目とその後の最初の項目の間にある単純な非改行文字列を取得します」と定式化することができ、次のことができます(GNUを使用) :<value>
<
grep
grep -oP '<value>\K[^<]+' file
もちろん、これは少し異なる方法で失敗する可能性があります。たとえば、複数行の値がある場合、または値タグに<value foo=bar>
または同じものがある場合、これは完全に有効な他の複数のXML状況でも機能します。正しい方法はXM:パーサーを使用することです。確認したいかもしれませんxmllint
またはXMLスター他のものの間。
答え2
すべての入力が投稿したサンプル入力の1行と正確に一致する場合:
$ cat file
"<property>name="DBName"><value>ABC</value>name="DBName"><value>DEF</value></property>
その後、awkを使用してください。
$ awk -F'[<>]+' '{for (i=5; i<=NF; i+=4) print $i}' file
ABC
DEF
ただし、XMLパーサーを使用しない他のソリューションと同様に、このソリューションも脆弱です。
答え3
使用XMLStarlet
:
以下からインポートしたXMLファイル回答。
<config>
<property name="DBName"><value>ABC</value></property>
<property name="DBName" year="2023"><value>DEF</value></property>
<property name="SystemName"><value>s70</value></property>
</config>
$ xmlstarlet select -t -v '//value' --nl ex.xml
ABC
DEF
s70
$ xmlstarlet select -t -m '//property[@name="DBName"]' -v 'value' --nl ex.xml
ABC
DEF
awkを使用してください:
$ awk -v pat1="<value>" -v pat2="</value>" '
{
while (match($0, pat1)){
$0=substr($0,RSTART+RLENGTH);
if (match($0, pat2)) print substr($0,1,RSTART-1)
}
}
'
問題に対する解決策はawk
機能しますが、多くの場合失敗する可能性があります。pcregrep
$ pcregrep -o1 '<value>(.*?)</value>'
答え4
私たちのように正しい形式のXML入力がある場合
<config>
<property name="DBName"><value>ABC</value></property>
<property name="DBName" year="2023"><value>DEF</value></property>
<property name="SystemName"><value>s70</value></property>
</config>
XML認識ツールを使用し、Xpath(または同様のツール)を使用して抽出する部分を選択できます。例は次のとおりです。ヒデル:
## 1) get all values:
$ xidel -e "//value" ex.xml
ABC
DEF
s70
## 2) get the values inside "property" with attribute "name" "DBname"
$ xidel -e "//property[@name='DBname']/value" ex.xml
ABC
DEF