sed와 문자 또는 줄 끝 일치


1

PYTHONPATH공통 구문이 있는 변수 를 정리하려고 합니다.

/a/path:/another/path/:/one/more/path

로 시작하는 모든 경로를 제거하고 싶습니다 /mnt. 먼저 다음을 시도하십시오 sed.

sed 's,/mnt/[^:]\+:,,g' <<< $PYTHONPATH

/mnt/콜론을 제외한 하나 이상의 문자 와 그 뒤에 오는 콜론 문자가 뒤에 오는로 시작하는 모든 항목을 제거합니다 .

그러나 다음 예제에서는 실패합니다.

PYTHONPATH="/mnt/first/path:/mnt/second/path"

두 번째 경로는 콜론으로 끝나지 않기 때문입니다. 약간 다른 조건으로 다른 검색을 실행하는 것보다 더 나은 것을 낳을 수 없었습니다.

sed 's,/mnt/[^:]\+:,,g;s,/mnt/.*$,,g' <<< $PYTHONPATH

이제 콜론으로 끝나는 모든 발생이 제거 된 후 다른 실행은 /mnt/문자열의 끝으로 시작 하고 끝나는 모든 발생을 제거합니다 (사실, 최대 하나) .

질문 :

  1. 이 작업에 적합한 솔루션입니까?
  2. 위의 솔루션이 실패하는 특별한 경우가 있습니까?
  3. 여기서 단일 검색 솔루션이 가능합니까? 그냥 궁금해서

미리 감사드립니다!

답변:


2

Argonauts가 지적했듯이 OR 문을 사용하여 한 줄로 할 수 있습니다. 반드시 -r옵션 을 사용할 필요는 없지만 sed다음과 같이 괄호와 막대를 이스케이프해야하기 때문에 명령이 조금 더 복잡해집니다.

sed 's,/mnt/[^:]\+\(:\|$\),,g' <<< "$PYTHONPATH"

bash에서 변수를 인용하는 것이 좋습니다.


MacOS에서는 작동하지 않았습니다. GNU sed를 설치하고 사용하여 문제를 해결했습니다.
Phlippie Bosman

1

당신이 가지고있는 것은 받아 들일 수 있지만 훨씬 쉽고 더 쉬운 방법은 다음과 같습니다.

새로운 변수를 만드십시오

NEWVAR="${PYTHONPATH}:"
sed 's,/mnt/[^:]\+:,,g' <<< $NEWVAR

이것을 변수에 할당하고 추가 된 콜론을 다시 트림하고 bash 변수 조작으로 다음과 같이 할 수 있다고 가정합니다.

newvar="${PYTHONPATH}:"
nomnt=$( sed 's,/mnt/[^:]\+:,,g' <<< $newvar )
nomnt=${nomnt%%:}
echo ${nomnt}

또는 모든 sed에서 :

sed 's,/mnt/[^:]\+:,,g;s/:$//;' <<< "${PYTHONPATH}:"

1

sed와 함께 확장 정규 표현식을 사용하여 작업을 약간 단순화 할 수 있습니다.

sed -r 's,/mnt/[^:]+(:|$),,g' <<< $PYTHONPATH

-r이 경우 OR 문을입니다 확장 정규식의 사용 표시 (:|$)가 콜론 또는 라인의 한쪽 끝에서 패턴 일치를 종료하는 원인을.

참고 : OS X 및 BSD 버전의 sed -E대신에-r

그리고 맹목적으로 명백한 것처럼 보이지만 PYTHONPATH 자체를 업데이트하려는 경우 / mnt / * 항목을 제거한 후 값을 할당해야합니다.

export PYTHONPATH=$(sed -r 's,/mnt/[^:]+(:|$),,g' <<< $PYTHONPATH)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.