Unix 셸: 정규식이 포함된 하위 문자열

Unix 셸: 정규식이 포함된 하위 문자열

다음과 같은 텍스트가 있습니다.

1234

정규식을 사용하여 첫 번째 숫자(이 경우 1)를 제외한 모든 숫자를 선택하고 싶습니다. 따라서 패턴이 선택되었습니다.

234

어떻게 해야 하나요? 변수는 사용할 수 없고 정규식만 사용할 수 있습니다. 그리고 첫 번째 숫자도 제거할 수 없습니다. 첫 번째 숫자를 제외한 모든 문자열을 선택하는 정규식은 하나만 있습니다.

답변1

문자열 인수에 정규식을 적용하는 표준 명령은 expr해당 연산자를 사용하는 것 입니다 :. 표준을 이해합니다기본 정규식. 정규식이 일치하는지 여부에 따라 1 또는 0을 출력합니다. 단, 정규식에 하나 이상의 캡처링 그룹이 있는 경우에는 첫 번째 캡처링 그룹과 일치하는 항목을 출력합니다. expr의 한 가지 특징 :은 정규 표현식이 마치 로 시작하는 것처럼 암시적으로 시작 부분에 고정된다는 것입니다 ^. 그래서:

text=1234
expr "x$text" : "x.\(.*\)"

텍스트와 정규식 모두에 (임의로) 접두사를 붙입니다. 그렇지 않으면 x의 내용이 정확히 연산자이거나 적어도 일부 연산자인 경우 명령이 실패하고 구현에 따라 이러한 연산자에 문제가 있을 것입니다. 예:$textexprexpr

$ 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}앞 부분이 제거된 내용 과 일치하도록 확장되는 위치입니다 .$varpattern

답변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

관련 정보