我试图/home/mytest/data
从文件的每一行中grep 特定模式1.txt
,当找到匹配时,然后将完整行复制到2.txt
文件中。但2.txt
文件中的结果集不是预期的结果。
代码
i=/home/mytest/data
IFS=',' read -ra ADDR <<< "$File_Name"
Input=1.txt
for i in "${ADDR[@]}";
do
j=0
while IFS= read -r line;
do
j=$((j+1))
Exists=$(echo $line | grep -w "$i" )
if [[ ! -z "$Exists" ]]; then
cp=$(echo $line >> 2.txt)
fi
done <"$Input"
预期结果 - 2.txt
# file: /home/mytest/data # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::--- default:user::rwx default:group::r-x default:group:smr:rwx default:group:agm:r-x default:mask::rwx default:other::---
实际结果 - 2.txt
# file: /home/mytest/data # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::--- default:user::rwx default:group::r-x default:group:smr:rwx default:group:agm:r-x default:mask::rwx default:other::---
# file: /home/mytest/datasr123 # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::---
grep 版本:GNU grep 2.20
答案1
问题是,使用(非标准)选项-w
,grep
将需要在模式之前和之后有一个字边界。 “词边界”是词和非词之间的过渡。 “单词”是包含单词字符(如a
、b
等)的字符串,而非单词是包含空格、 、 等字符的/
字符串?
。
由于/
不是“单词字符”,因此它之前不能有单词边界(除非它立即之前通过单词字符)。因此,某些版本grep
永远无法匹配数据中的字符串。其他版本会能够进行比赛。
由于您似乎想要匹配紧接其前面的行上的路径,并且由于我们知道该路径在同一行上# file:
紧随其后,因此我们可以使用这些字符串作为给定路径的分隔符: # owner:
querypath=/home/mytest/data
grep -F "# file: $querypath # owner:" 1.txt >2.txt