/home/mytest/data
ファイルの各行で特定のパターンを見つけようとしています。一致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