문자열에서 첫 번째 문자와 마지막 문자를 배쉬 제거


98

나는 그런 문자열을 가지고있다 :

|abcdefg|

그리고 나는 |시작과 끝에 두 문자가 없는 원래 문자열로 어쨌든 (string2와 같은) 새로운 문자열을 얻고 싶습니다 .

abcdefg

bash에서 가능합니까?

답변:


120

넌 할 수있어

string="|abcdefg|"
string2=${string#"|"}
string2=${string2%"|"}
echo $string2

또는 문자열 길이가 일정하면 할 수 있습니다

string="|abcdefg|"
string2=${string:1:7}
echo $string2

또한 이것은 작동해야합니다

echo "|abcdefg|" | cut -d "|" -f 2

또한 이것

echo "|abcdefg|" | sed 's/^|\(.*\)|$/\1/'

2
또한awk -F\| '{ print $2 }' <<<"|string|"
enzotib

1
@enzotib 항상 멋진 awk솔루션이 있습니다. 나는 배울 필요가있다 awk.
Kris Harper

3
또한 IFS='|' read string2 <<< $string:)
정렬

10
또한 bash 4.2 이상에서"${string:1:-1}"
geirha

의 "파라미터 확장"섹션을 읽으십시오 man bash.
니모

62

다음은 문자열 길이 (bash)와 무관 한 솔루션입니다.

string="|abcdefg|"
echo "${string:1:${#string}-2}"

29

여기에 나열된 몇 가지 게시물을 삭제하는 가장 간단한 방법은 다음과 같습니다.

string="|abcdefg|"
echo ${string:1:-1}

편집 : bash 4.2와 함께 우분투에서 작동합니다. bash 4.1을 사용하는 centOS에서 작동하지 않습니다


19

또 다른 방법은 head& tail명령 을 사용하는 것입니다 .

$ echo -n "|abcdefg|" | tail -c +2 | head -c -2
abcdefg

1
나는 [something something]대괄호를 자르 겠다는 목표를 가지고 있었 으므로 echo "[something something]" | tail -c +2 | head -c -2해결되었습니다. 팁 주셔서 감사합니다!
Ain Tohvri

분명히이어야합니다 echo -n "|abcdefg|" | tail -c +2 | head -c -1. 수정 사항이 왜 거부되었는지 잘 모르겠습니다. 정직하게 생각하면 매우 슬프습니다. 참조 man head추가 정보를 원하시면
드미트리 Khamitov


9

sed를 사용하여 | 심볼 자체를 참조 할뿐만 아니라 다음과 같이 위치 참조를 사용합니다.

$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg

':'은 구분 기호입니다 (쿼리에없는 / 또는 다른 문자로 바꿀 수 있습니다, s 다음에 오는 기호는 그것을 수행합니다) 여기서 ^ (캐럿)은 입력 문자열의 시작 부분을 의미하고 $ (달러)는 의미합니다 끝에. . 캐럿 뒤에 있고 달러 기호 앞에있는 것은 단일 문자를 나타냅니다. 다시 말해 우리는 첫 번째와 마지막 문자를 삭제합니다. 이 경우에도 문자가 삭제됩니다. | 문자열에 없습니다.

전의:

$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef

3

쉘 기능

좀 더 장황한 접근 방식이지만 모든 종류의 첫 번째 문자와 마지막 문자에서 작동하므로 동일 할 필요는 없습니다. 기본 아이디어는 변수를 취하여 문자별로 읽고 새 변수에 원하는 변수 만 추가한다는 것입니다.

여기 좋은 아이디어로 형식화 된 아이디어가 있습니다.

crop_string_ends() {
    STR="$1" 
    NEWSTR="" 
    COUNT=0 
    while read -n 1 CHAR 
    do
        COUNT=$(($COUNT+1)) 
        if [ $COUNT -eq 1 ] || [ $COUNT -eq ${#STR} ] 
        then
            continue 
        fi 
        NEWSTR="$NEWSTR"$CHAR 
    done <<<"$STR" 
    echo $NEWSTR 
}

그리고 동일한 기능이 작동합니다.

$> crop_string_ends "|abcdefg|"                                                                                       
abcdefg
$> crop_string_ends "HelloWorld"                                                                                      
elloWorl

파이썬

>>> mystring="|abcdefg|"
>>> print(mystring[1:-1])
abcdefg

또는 명령 행에서 :

$ python -c 'import sys;print sys.stdin.read()[1:-2]' <<< "|abcdefg|"                                             
abcdefg

AWK

$ echo "|abcdefg|" | awk '{print substr($0,2,length($0)-2)}'                                                      
abcdefg

루비

$ ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|"                                                               
abcdefg

2

작고 보편적 인 솔루션 :

expr "|abcdef|" : '.\(.*\).'

이 경우 특별하고 '|' 문자가있을 수도 있고 없을 수도 있습니다.

expr "|abcdef" : '|*\([^|]*\)|*'

2
$ string="|abcdefg|"
$ string="${string#?}" && string="${string%%?}"
$ echo "$string"
abcdefg

에서 http://tldp.org/LDP/abs/html/parameter-substitution.html

${var#Pattern}
에서 제거 최단 의 부분 즉, 일치하는 프론트 엔드 의를 . 에서 제거 최장 의 부분 즉, 일치하는 백 엔드 의를 . $var$Pattern$var
${var%%Pattern}
$var$Pattern$var

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.