이 질문이 들리는 것만큼 순진하지 않다고 생각한다는 점부터 시작하겠습니다.
해야 할 일: 폴더의 PATH 환경 변수를 확인하세요. 처음에 있을 수도 있고 나중에 있을 수도 있습니다. 폴더가 존재하는지 확인하면 됩니다.
내 질문의 예 - 를 사용해 보겠습니다 /opt/gnome
.
시나리오 1: 폴더가 PATH의 시작 부분에 없습니다.
# echo "$PATH"
/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome
# echo "$PATH" | grep ":/opt/gnome"
/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome
/var/opt/gnome
grep은 콜론을 포착하지 않도록 충분히 구체적이어야 합니다 .
시나리오 2: 폴더가 PATH의 시작 부분에 있습니다.
# echo "$PATH"
/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome
# echo "$PATH" | grep "^/opt/gnome"
/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome
내 문제는 다음과 같습니다. 이 폴더에서 콜론이나 줄 시작 부분을 검색해야 합니다. 내가 하고 싶은 것은 다음 두 가지 대괄호 표현식 중 하나입니다.
# echo $PATH | grep "[^:]/opt/gnome"
# echo $PATH | grep "[:^]/opt/gnome"
하지만[^
그리고 [:
그 자체의 의미가 있습니다.따라서 위의 두 명령은 작동하지 않습니다.
하나의 명령으로 두 경우 모두를 grep하는 방법이 있습니까?
답변1
PATH
파일에서 무언가를 찾는 대신 환경 변수의 내용을 확인하는 경우 이는 grep
잘못된 도구입니다. 셸에서 이 작업을 수행하는 것이 더 쉽고(더 빠르며, 아마도 더 읽기 쉽습니다).
Bash, ksh 및 zsh에서:
if [[ :$PATH: = *:/opt/gnome:* ]]; then
: # already there
else
PATH=$PATH:/opt/gnome
fi
가지고 다닐 수 있는:
case :$PATH: in
*:/opt/gnome:*) :;; # already there
*) PATH=$PATH:/opt/gnome;;
esac
:$PATH:
; 대신 ; 를 사용하십시오 $PATH
. 이렇게 하면 구성 요소가 의 시작이나 끝에 있더라도 검색 문자열에서 항상 콜론으로 묶입니다 $PATH
.
파일의 한 줄을 검색하는 경우 확장 정규식(예: require grep -E
) 을 사용하여 (^|:)/opt/gnome($|:)
일치시킬 수 있지만 /opt/gnome
, 줄의 시작 부분이나 콜론 뒤에 있는 경우, 그리고 줄의 끝 부분에 있는 경우에만 가능합니다. 그 뒤에는 콜론이 옵니다.
답변2
다음을 사용하여 정규식을 확장할 수 있습니다.grep -E
오탐을 방지하려면 찾고 있는 경로의 시작과 끝을 일치시켜야 합니다.
시작 부분과 일치하는 예:
$ TEST=/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome
$ echo $TEST | grep -E "(:|^)/opt/gnome(:|$)"
/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome
중간 인스턴스와도 일치합니다.
$ TEST=/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome
$ echo $TEST | grep -E "(:|^)/opt/gnome(:|$)"
/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome
거짓 긍정 방지:
$ TEST="/home/bob/opt/gnome:/opt/gnome/somethingelse:/opt/gnome-beta"
$ echo $TEST | grep -E "(:|^)/opt/gnome(:|$)"
거기에는 일치하는 항목이 없습니다.
컴팩트하고 우아합니다. 데비안 7에서 테스트되었습니다.
답변3
미혼인 경우에는 다음의 기록을 grep
사용하고 분리할 수 있습니다 .awk
:
awk 'BEGIN {RS=":"} /^\/opt\/gnome$/'
답변4
답변이 충분할지 모르겠지만
grep -w "/opt/gnome"
귀하의 요구를 충족시킬 것입니다.
echo '/sbin:/usr/sbin:/opt/gnome:/var/opt/gnome' | grep -w "/opt/gnome" -o
/opt/gnome
echo '/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome' | grep -w "/opt/gnome" -o
/opt/gnome
하지만
echo '/opt/gnome:/sbin:/usr/sbin:/var/opt/gnome' | grep "/opt/gnome" -o
/opt/gnome
/opt/gnome