次のXML構造があり、grepを使用して単一のコマンドからCUSTOMER_IDタグとSTORE_IDタグの最初の2文字を抽出しようとしています。以下を使用して、単一のラベルに対してこれを行うことができます。
grep -oP '(?<=< STORE_ID >).*(?=< /STORE_ID >)' filename.* | awk '{print substr($0,2,2)}'
<CUSTOMER_ID>12345678910</CUSTOMER_ID>
<FIRSTNAME>Shubham</FIRSTNAME>
<LASTNAME>Anand</LASTNAME>
<STORE_ID>mystore</STORE_ID>
複数のタグに対してこれを行う方法は?
出力は1行にする必要があります。たとえば、上記の場合、結果は12 myでなければなりません。
注:複数のファイルの出力が必要です。だから入れなければなりません。filename.*
答え1
提供された入力と出力の例に基づいて、単一ファイルsed
の簡単な解決策は次のとおりですinfile
。
$ cat infile
<CUSTOMER_ID>12345678910</CUSTOMER_ID>
<FIRSTNAME>Shubham</FIRSTNAME>
<LASTNAME>Anand</LASTNAME>
<STORE_ID>mystore</STORE_ID>
$ sed -n -e 's/<CUSTOMER_ID>\(..\)\(.*\)<.*>/\1/p' -e 's/<STORE_ID>\(..\)\(.*\)<.*>/\1/p' infile | sed '$!N;s/\n/ /'
12 my
$
上記の内容を単純なシェルスクリプトループでラップすると、複数のファイルを簡単に処理できます。