처음 9자와 마지막 2자를 제거하는 데 사용 hello123456789
하려면 이것을 변환해야 합니다 .567
sed
명령을 찾고 있는데 찾을 수 없습니다. 기능을 실행하기 위해 여러 언어를 시도했지만 운이 없었습니다.
답변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
답변4
또 다른 ( bash
) 멋진 방법:
str="hello123456789"
[[ "$str" =~ ^.{9}(.*).{2}$ ]]
echo "${BASH_REMATCH[1]}"