sed: 다른 문자열이 처음 나타날 때까지 문자열 사이의 텍스트를 삭제합니다.

sed: 다른 문자열이 처음 나타날 때까지 문자열 사이의 텍스트를 삭제합니다.

다음과 같은 텍스트가 있다고 상상해 보세요.

2012년과 2013년에 빠른 갈색 여우가 점프합니다.

그리고 4개의 숫자를 포함하여 "fox"에서 해당 부분을 삭제하고 싶지만 첫 번째 항목에서만 삭제하고 싶으므로 다음과 같이 됩니다.

더 퀵 브라운과 2013

뭔가 마음에 들어요...:

echo "빠른 갈색여우는 2012년과 2013년에 점프합니다" \
   | sed "s/fox.*\([0-9]\{4\}\)//g"

...나에게 다음을 가져옵니다:

퀵 브라운

그래서 네 개의 숫자가 마지막으로 나타나는 것을 포함하여 모든 것을 제거했습니다.

어떤 아이디어가 있나요?

답변1

sed"기본" 및 "확장" 버전 모두 에서 사용되는 POSIX 정규식은 탐욕스럽지 않은 일치를 지원하지 않습니다. ( [^0-9]*대신 사용하는 등의 해결 방법이 있지만 .*입력이 많이 달라지면 신뢰할 수 없게 됩니다.)

?non-greedy 수량자를 사용하여 Perl에서 필요한 것을 얻을 수 있습니다 .

echo "The quick brown fox jumps in 2012 and 2013" \
   | perl -pe 's/fox.*?([0-9]{4})//g'

추가 공간을 제거할 수도 있습니다.

답변2

당신이 사용하고 싶다고 가정오직sed를 사용하고 숫자 뒤의 단어가 무엇인지 신경 쓰지 않고 일치의 끝이 숫자의 첫 번째 그룹이 되기를 원하면 다음과 같이 작동합니다.

echo "빠른 갈색여우는 2012년과 2013년에 점프합니다" \
   | sed "s/fox[^0-9][^0-9]*[0-9][0-9]* //"

패턴은 일치 fox, 하나 이상의 숫자가 아닌 숫자 [^0-9][^0-9]*, 하나 이상의 숫자 순 으로 작동합니다 [0-9][0-9]*. 이 패턴은 4자리가 아닌 임의의 숫자에서 작동합니다. 정확히 4자리를 일치시키려면 다음과 같이 변경하세요.

echo "빠른 갈색여우는 2012년과 2013년에 점프합니다" \
   | sed "s/fox[^0-9]*\([0-9]\{4\}\) //"

답변3

지정하지 않으셨습니다정확히귀하의 요구 사항은 무엇입니까? 다단계 프로세스가 필요할 수도 있습니다. 입력에 포함되지 않을 문자열을 선택하세요(예: ####).

echo "빠른 갈색 여우는 2012년과 2013년에 게으른 개 42마리를 뛰어넘었습니다." \
  | sed \
        -e "s/[0-9]\{4\}/&####/" \
        -e "s/fox.*####//" \
        -e "s/####//"

-e "s/[0-9]\{4\}/&####/"( 가독성 을 위해 명령을 과도하게 접었 ####습니다 .)첫번째네 자리 숫자. (경고: 이 값 65536은 로 변경됩니다 6553####6.) 및 를
-e "s/fox.*####//"포함하는 라인 , 즉 최소한 하나의 4자리 숫자를 포함하는 라인에 영향을 미치고 에서 까지 삭제합니다 .fox####fox첫번째네 자리 숫자.
-e "s/####//"는 물론 ####4자리 숫자가 포함되어 있지만 가 아닌 줄에서 남은 문자열을 모두 제거합니다 fox.

숫자 뒤에 공백이 있는 경우 공백 하나를 제거하려면,

echo "빠른 갈색 여우는 2012년과 2013년에 게으른 개 42마리를 뛰어넘었습니다." \
  | sed \
        -e "s/[0-9]\{4\}/&####/" \
        -e "s/fox.*#### //" \
        -e "s/fox.*####//" \
        -e "s/####//"

g경고: 모든 명령에 추가할 수 있지만 문제의 근본 원인인 를 s계속 사용하기 때문에 여전히 처리되지 않습니다..*

One fox jumps in 2012 and 2013, another fox will jump in 2014 and 2015.

아마도 당신이 원하는 방식으로. 그리고 물론 당신은~하지 않다다음에 주입할 것이기 때문에 g추가 하고 싶습니다 ."s/[0-9]\{4\}/&####/"####모든네 자리 숫자, 요점을 무너뜨립니다. 그러면 다음 "s/fox.*####//"과 같이 작동하게 됩니다 "s/fox.*[0-9]\{4\}//"(비기여 문자가 제거된 원래 명령). 즉, 바뀔 것이다

빠른 갈색 여우는 2012년과 2013년에 점프합니다.

에게

빠른 갈색 여우는 2012#### 및 2013####에서 점프합니다.

그리고 나서

빠른 갈색 .

관련 정보