
다음과 같은 텍스트가 있다고 상상해 보세요.
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####에서 점프합니다.
그리고 나서
빠른 갈색 .