为什么以下给出了我正在搜索的行:
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
,否则如果该行包含正则表达式模式,则会失败。