Grep의 정확한 일치 패턴

Grep의 정확한 일치 패턴

/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

관련 정보