문자열 앞에서 문자를 ‘삭제’/ 삭제하는 방법은 무엇입니까? 출력이 그대로 W2345678입니까? 는 I가에서

조작하려는 문자열이 있습니다. 문자열은 H08W2345678어떻게 처리 할 수 ​​있으므로 출력이 그대로 W2345678입니까?

는 I가에서 마지막 네 문자를 삭제하고 싶었 마찬가지로 만약 H08W2345678내가 얻을 그래서 H08W234내가 이런 짓을 했을까 방법?



답변

bash (또는 ksh93그 구문이 나오는 곳 zsh)을 사용하십시오.

string="H08W2345678"

echo "${string:3}"
W2345678

echo "${string:0:-4}"
H08W234

문자열 조작 에 대한 자세한 내용은 Wooledge 위키를 참조하십시오 .


답변

$ echo "H08W2345678" | sed 's/^.\{3\}//'
W2345678

sed 's/^.\{3\}//'처음 세 문자를 찾아 ^.\{3\}공백으로 바꿉니다. 여기서는 ^.문자열의 시작 부분에있는 모든 문자를 일치시키고 (문자열 ^의 시작을 나타냄) \{3\}이전 패턴을 정확히 3 번 일치시킵니다. 따라서 ^.\{3\}처음 세 문자와 일치합니다.

$ echo "H08W2345678" | sed 's/.\{4\}$//'
H08W234

마찬가지로 sed 's/.\{4\}$//'마지막 4자를 공백으로 바꿉니다 ( $문자열의 끝을 나타냄).


답변

모든 줄이 11 자 (또는 무엇이든) 문자열 인 파일이 있으면
sed사용할 도구입니다. 단일 문자열을 조작하는 것은 좋지만 과잉입니다. 단일 문자열 경우 bash 버전 4.2 이상에 액세스 할 수 있다면 Jason의 대답 이 가장 좋습니다. 그러나
및 구문은 bash (well, bash, ksh93, mksh 및 zsh)에 고유 한 것으로 보입니다 . Shell Command Language의 Open Group Base Specification 에는 보이지 않습니다 . 하위 문자열 확장 (추출)을 지원하지 않는 POSIX 호환 쉘이 붙어 있으면${parameter:offset}${parameter:offset:length}

$ printf "%s\n" "${string#???}"
W2345678

$ printf "%s\n" "${string%????}"
H08W234

처음 세 문자를 삭제하면 왼쪽에있는 것과 같은 문자열을 피하기 위해 printf대신에 사용 합니다
(그리고 원하는 것을하지 않습니다).echoabc-e-eecho -e

그리고 Bourne-family 쉘을 전혀 사용하지 않는 경우 (또는 고대의 POSIX 이전 시스템을 사용하는 경우) 여전히 작동합니다.

$ expr " $string" : ' ...\(.*\)'
W2345678

$ expr " $string" : ' \(.*\)....'
H08W234

여분의 주요 공간의 값에 문제가되지 않도록하는 것입니다 $string
실제되는 expr사업자 (예를 들면, +,  /,  index또는 match) 또는 옵션 (예 :  --, --help또는  --version).


답변

와:

string="H08W2345678"

대부분의 셸에서 3 ~ 4 개의 문자를 일치시키는 것이 간단 해 보입니다

$ printf '%s\t%s\n' "${string#???}" "${string%????}"
W2345678      H08W234

Bourne 쉘과 같은 이전 쉘의 경우 다음을 사용하십시오.

$ string=H08W2345678

$ expr " ${string}" : " ...\(.*\)"
W2345678

$ expr " ${string}" : " \(.*\)...." '
H08W234

숫자가 필요한 경우 다음을 사용하십시오.

$ expr " ${string}" : " .\{3\}\(.*\)"
W2345678

$ expr " ${string}" : " \(.*\).\{4\}" '
H08W234

물론 그 정규 표현식은 sed, awk 및 bash 3.0 이상에서도 작동합니다.

$ echo "$string" | sed 's/^.\{3\}//'
W2345678

$ echo "$string" | sed 's/.\{4\}$//'
H08W234

$ echo "$string" | awk '{sub(/^.{3}/,"")}1'
W2345678

$ echo "$string" | awk '{sub(/.{4}$/,"")}1'
H08W234

$ r='^.{3}(.*)$'; [[ $a =~ $r ]] && echo "${BASH_REMATCH[1]}"
W2345678

$ r='^(.*).{4}$'; [[ $a =~ $r ]] && echo "${BASH_REMATCH[1]}"
H08W234

답변

문자열 앞에서 문자를 ‘삭제’/ 삭제하는 방법은 무엇입니까?

조작하려는 문자열이 있습니다. 문자열은 H08W2345678입니다. 어떻게 출력을 W2345678로 만들 수 있습니까?

echo "H08W2345678" | cut -c 4-