私はそのような文字列を持っています:
|abcdefg|
そして、私はこれを得るため|
に、最初と最後に2文字のない元の文字列で、何らかの方法で(string2のような)と呼ばれる新しい文字列を取得したい:
abcdefg
それはbashで可能ですか?
私はそのような文字列を持っています:
|abcdefg|
そして、私はこれを得るため|
に、最初と最後に2文字のない元の文字列で、何らかの方法で(string2のような)と呼ばれる新しい文字列を取得したい:
abcdefg
それはbashで可能ですか?
回答:
できるよ
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/'
awk
ソリューションがあります。学ぶ必要がありますawk
。
IFS='|' read string2 <<< $string
:)
"${string:1:-1}"
man bash
。
ここにリストされているいくつかの投稿から離れると、それを行う最も簡単な方法のようです:
string="|abcdefg|"
echo ${string:1:-1}
編集:bash 4.2でubuntuで動作します。CentOSでbash 4.1が機能しない
別の方法は、head
&tail
コマンドを使用することです:
$ echo -n "|abcdefg|" | tail -c +2 | head -c -2
abcdefg
[something something]
かっこを切るという目標を持ったので、echo "[something something]" | tail -c +2 | head -c -2
うまくいきました。ヒントをありがとう!
echo -n "|abcdefg|" | tail -c +2 | head -c -1
。編集が拒否された理由がわかりません。正直言って、とても悲しいことです。参照してください。man head
詳細は
sedを使用して|を削除することもできます。シンボル自体を参照するだけでなく、次のように位置参照を使用します。
$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg
ここで、「:」は区切り文字です(/またはクエリに含まれない任意の文字に置き換えることができます。sに続く記号はすべて実行されます)。ここで^(キャレット)は入力文字列の先頭、$(ドル)は最後に。。(ポイント)キャレットの後ろにあり、ドル記号の前にあるキャレットは、単一の文字を表します。つまり、最初と最後の文字を削除しています。これは|であっても文字を削除することに注意してください。文字列には存在しません。
例:
$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef
もう少し冗長なアプローチですが、あらゆる種類の最初と最後の文字で機能し、同じである必要はありません。基本的な考え方は、変数を取得し、文字ごとに読み取り、必要なものだけを新しい変数に追加することです
素敵な関数にフォーマットされたアイデア全体がここにあります
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
$ echo "|abcdefg|" | awk '{print substr($0,2,length($0)-2)}'
abcdefg
$ ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|"
abcdefg
$ 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
awk -F\| '{ print $2 }' <<<"|string|"