다음과 같은 텍스트가 있습니다.
1234
정규식을 사용하여 첫 번째 숫자(이 경우 1)를 제외한 모든 숫자를 선택하고 싶습니다. 따라서 패턴이 선택되었습니다.
234
어떻게 해야 하나요? 변수는 사용할 수 없고 정규식만 사용할 수 있습니다. 그리고 첫 번째 숫자도 제거할 수 없습니다. 첫 번째 숫자를 제외한 모든 문자열을 선택하는 정규식은 하나만 있습니다.
답변1
문자열 인수에 정규식을 적용하는 표준 명령은 expr
해당 연산자를 사용하는 것 입니다 :
. 표준을 이해합니다기본 정규식. 정규식이 일치하는지 여부에 따라 1 또는 0을 출력합니다. 단, 정규식에 하나 이상의 캡처링 그룹이 있는 경우에는 첫 번째 캡처링 그룹과 일치하는 항목을 출력합니다. expr
의 한 가지 특징 :
은 정규 표현식이 마치 로 시작하는 것처럼 암시적으로 시작 부분에 고정된다는 것입니다 ^
. 그래서:
text=1234
expr "x$text" : "x.\(.*\)"
텍스트와 정규식 모두에 (임의로) 접두사를 붙입니다. 그렇지 않으면 x
의 내용이 정확히 연산자이거나 적어도 일부 연산자인 경우 명령이 실패하고 구현에 따라 이러한 연산자에 문제가 있을 것입니다. 예:$text
expr
expr
$ text='('
$ expr "$text" : ".\(.*\)"
expr: syntax error: expecting ')' instead of ‘.\\(.*\\)’
$ expr "x$text" : "x.\(.*\)"
$ text=index
$ expr "$text" : ".\(.*\)"
0
$ expr "x$text" : "x.\(.*\)"
ndex
첫 번째 문자는 캡처 그룹 내에 없기 때문에 .
출력되지 않는 첫 번째 문자와 일치합니다 . $text
그런 다음 나머지 .*
0개 이상의 문자를 캡처하여 출력에 최대한 많이 사용합니다.
$text
정규 표현식이 일치하지 않거나(비어 있거나 문자로 해석될 수 없는 항목으로 시작하는 경우) 또는 출력이 숫자인 경우 ( 구현 0
에 따라 다른 값이 다른 경우) 종료 상태는 0이 아닙니다. , ... expr
와 같은 철자법 또는 빈 문자열입니다.00
-0
expr
그러나 어쨌든 이를 위해 정규식을 실행하거나 사용할 필요는 없습니다 . 표준 쉘 인수 확장 연산자는 다음을 수행합니다.
text=1234
printf '%s\n' "${text#?}"
${var#pattern}
앞 부분이 제거된 내용 과 일치하도록 확장되는 위치입니다 .$var
pattern
답변2
텍스트가 file 에 있다고 가정하면 file
다음 sed
명령은 파일의 각 줄의 첫 번째 숫자를 제거하고 결과를 인쇄합니다.
sed 's/[[:digit:]]//' file
시험:
$ cat file
123
1234
alpha123
a1b2c3
$ sed 's/[[:digit:]]//' file
23
234
alpha23
ab2c3
문자열이 변수에 있으면 실제로 정규식이 필요하지 않습니다. 충분할 것이다
${string/[[:digit:]]/}
존재하다 bash
.
$ string=alpha123
$ printf '%s\n' "${string/[[:digit:]]/}"
alpha23
첫 번째 위치에 나타나는 숫자만 제거하려면 표준 매개변수 대체를 사용할 수 있습니다.
${string#[[:digit:]]}
좋다
$ string=1234
$ printf '%s\n' "${string#[[:digit:]]}"
234