파일에 "content" 줄이 이미 포함되어 있는지 확인하는 방법은 무엇입니까?

파일에 "content" 줄이 이미 포함되어 있는지 확인하는 방법은 무엇입니까?

콘텐츠 X가 포함된 줄로 파일이 준비되었는지, 그렇지 않은 경우 줄이 추가되었는지 알아야 합니다. 내가 시도한 코드는 다음과 같습니다.

if ! $(grep 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' ~/.bashrc)
then
    echo 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' >> ~/.bashrc
fi

답변1

#!/bin/bash

LINE='eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)'

if ! grep -qF "$LINE" file.txt ; then echo "$LINE" >> file.txt ; fi

$(...)는 오류 수준 값이 아닌 명령 결과를 반환합니다. 올바른 반환 코드를 얻기 위해 명령 대체 없이 사용할 수 있습니다.

답변2

리터럴 문자열을 검색하려면:

line='eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)'
file=~/.bashrc
if ! grep -q -x -F -e "$line" <"$file"; then
  printf '%s\n' "$line" >>"$file"
fi

-q출력을 억제합니다 grep(반환 상태에만 관심이 있습니다). -x일치하려면 전체 행이 필요합니다. -F정규식 대신 리터럴 문자열을 검색합니다. 만약을 대비해 시작하는 예방 조치입니다 -e.$line-

답변3

awks 함수를 사용하면 index운이 더 좋을 수도 있습니다 . 와 동일하므로 ( 패턴 일치 strstr보다는) 비교에 적합해야 합니다 .grep

답변4

이를 수행하려면 sed를 사용할 수 있습니다. 문제는 코드에 문자열을 두 번 포함해야 한다는 것입니다. 한 번 테스트한 후 다시 연결해 보세요.

sed -i '/eval \$(perl -I\$HOME\/foo\/lib\/perl5 -Mlocal::lib=\$HOME\/foo)/!{ ${ s/$/\neval \$(perl -I\$HOME\/foo\/lib\/perl5 -Mlocal::lib=\$HOME\/foo)/; }; }' /path/to/file

관련 정보