파일에서 처음 9자와 마지막 2자를 제거합니다.

파일에서 처음 9자와 마지막 2자를 제거합니다.

처음 9자와 마지막 2자를 제거하는 데 사용 hello123456789하려면 이것을 변환해야 합니다 .567sed

명령을 찾고 있는데 찾을 수 없습니다. 기능을 실행하기 위해 여러 언어를 시도했지만 운이 없었습니다.

답변1

sed 's/^.........\(.*\)..$/\1/' file

또는

sed 's/^.\{9\}\(.*\)..$/\1/' file

또는 비표준이지만 일반적으로 구현되는 -E옵션을 사용하여 확장 정규식을 활성화합니다.

sed -E 's/^.{9}(.*)..$/\1/' file

이들 모두는 먼저 줄 시작 부분의 9개 문자와 일치하고 그 다음 줄 중간(캡처됨)에 있는 임의 개수의 문자, 마지막으로 끝 부분의 두 문자와 일치합니다. 어쨌든 표현식의 중간 부분이 표현식의 첫 번째 비트와 마지막 비트를 줄의 시작과 끝에서 일치시키므로 ^and here에 $고정할 필요가 실제로 없습니다 . 전체 줄은 숫자에 관계없이 가운데에 캡처된 문자로 대체됩니다.

또 다른 방법 sed:

sed -e 's/.\{9\}//' -e 's/..$//' file

첫 번째 표현식은 처음 9자를 아무것도 없는 문자로 바꾸어 제거하고, 두 번째 표현식은 비슷한 방식으로 마지막 두 문자를 제거합니다. 두 번째 표현식은 줄 끝에 고정해야 $하지만 첫 번째 표현식은 기본적으로 줄 시작 부분부터 일치하므로 고정할 필요가 없습니다.


문자열이 쉘 변수에 있는 경우 var다음 두 가지 표준 변수 대체를 사용하면 먼저 문자열의 처음 9자를 제거한 다음 문자열의 마지막 두 문자를 제거합니다( ?쉘 글로빙 모드에서 사용될 때 모든 문자와 일치).

var=${var#?????????}
var=${var%??}

sed이는 문자열의 중간 부분을 전혀 고려하지 않고 문자열의 시작과 끝에서 특정 수의 문자를 일치시키고 제거하는 위의 마지막 변형을 모방합니다 .

이것을 테스트해 보세요:

$ var=hello123456789
$ var=${var#?????????}
$ var=${var%??}
$ printf '%s\n' "$var"
567

답변2

Bash 매개변수 확장을 사용합니다.

string=hello123456789
echo ${string:9:-2}
567

답변3

솔루션을 놓치지 않으려면 awk:

awk -v s=9 -v e=2 '{ print substr($0, s+1, length()-s-e ) }' infile

바라보다substr(문자열, 시작 위치, 길이).

답변4

또 다른 ( bash) 멋진 방법:

str="hello123456789"
[[ "$str" =~ ^.{9}(.*).{2}$ ]]
echo "${BASH_REMATCH[1]}"

관련 정보