为什么使用数组和 for 循环会将行分成 2 行?

为什么使用数组和 for 循环会将行分成 2 行?

为什么以下给出了我正在搜索的行:

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

而下面将其分成两行?

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是一个包含两个空格分隔的单词的字符串。

shell 会将其分成两个单词,因为它没有加引号,因此数组将有两个条目。

这将做你想做的事:

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

然而,解析 XMLgrep是一个可怕的想法。请改用适当的 XML 解析器。

另外,如果循环只是输出字符串,则可以将其替换为

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

要查看谁对受控文件的特定版本中与模式匹配的行进行了更改git(请参阅下面的注释),请git blame -L与有问题的模式和版本一起使用。请参阅git blame --help获取更多信息。


另请注意,要获取与模式匹配的行的行号:

sed -n '/pattern/=' file

不要仅仅为了获取行号而再次将结果输入grep到。grep如果这样做,请务必使用grep -F,否则如果该行包含正则表达式模式,则会失败。

相关内容