配列とforループを使用すると、行が2つの行に分割されるのはなぜですか? [コピー]

配列とforループを使用すると、行が2つの行に分割されるのはなぜですか? [コピー]

次が私が探している行を提供するのはなぜですか?

grep '<appointment-id internal:ref=1.2.3/>' test.xml  
OUTPUT is <appointment-id internal:ref=1.2.3/>  

そして以下では2行に分けます。

a=($(grep '<appointment-id internal:ref=1.2.3/>' test.xml))  
for i in "${a[@]}"; do  
    echo "checking $i"   
    grep  -n "$i" delete.xml
done    

出力は次のとおりです

checking <appointment-id
checking internal:ref=1.2.3/>

ファイルは次のとおりです

<note>  
    <to>Jim</to>  
    <from>John</from>  
    <heading>Reminder</heading>  
    <body>Some text</body>  
    <appointment-id internal:ref=1.2.3/> 
</note>

答え1

の出力は、grepスペースで区切られた2つの単語を含む文字列です。

シェルは引用されていないため、これを2つの単語に分割するため、配列には2つの項目があります。

これはあなたがしたいことをします:

a=( "$( grep -F '<appointment-id internal:ref=1.2.3/>' test.xml )" )  

しかし、XMLを解析するのはgrep恐ろしい考えです。。代わりに適切なXMLパーサーを使用してください。

また、ループが文字列を出力する場合は、次のように置き換えることができます。

printf 'checking %s\n' "${arr[@]}"

git制御されたファイルの特定のバージョン(以下の説明を参照)でパターンに一致する行を変更したことを確認するには、そのパターンとgit blame -Lバージョンを使用します。詳細についてはを参照してくださいgit blame --help


また、パターンに一致する行の行番号を取得するには、次のようにします。

sed -n '/pattern/=' file

行番号を取得するために結果を再入力しないでくださいgrepgrepこれを行う場合は必ず使用してくださいgrep -F。それ以外の場合、行に正規表現パターンが含まれていると失敗します。

関連情報