조작하려는 문자열이 있습니다. 문자열은 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
대신에 사용 합니다
(그리고 원하는 것을하지 않습니다).echo
abc-e
-e
echo -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-