Bashは文字列から最初と最後の文字を削除します


99

私はそのような文字列を持っています:

|abcdefg|

そして、私はこれを得るため|に、最初と最後に2文字のない元の文字列で、何らかの方法で(string2のような)と呼ばれる新しい文字列を取得したい:

abcdefg

それはbashで可能ですか?

回答:


121

できるよ

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
クリスハーパー

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でubuntuで動作します。CentOSでbash 4.1が機能しない


20

別の方法は、headtailコマンドを使用することです:

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

1
[something something]かっこを切るという目標を持ったので、echo "[something something]" | tail -c +2 | head -c -2うまくいきました。ヒントをありがとう!
アイン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

Python

>>> 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" : '|*\([^|]*\)|*'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.