콘텐츠 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
awk
s 함수를 사용하면 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