回答:
最初に、あなたはあなたが何をしたいかについて明確であるべきです。文字列がで終わり、.rtf
を削除したい.rtf
場合は、を使用できますvar2=${var%.rtf}
。サフィックスがわからないが、最後からすべて削除したい.
場合は、を使用できますvar2=${var%.*}
。最初のものまですべてを維持したい.
場合は、var2=${var%%.*}
。最後の2つのオプションは、期間が1つしかない場合は同じ結果になりますが、期間が複数ある場合は、どちらを使用するかを決める必要があります。
常に正確な数の文字を常に削除したい場合は、いくつかのオプションがあります。
具体的にはbashを指定したので、bashビルトインから始めます。最も長く機能したのは、上記で使用した接尾辞削除構文と同じです。4文字を削除するには、次を使用します。var2=${var%????}
。文字ごとに1つの疑問符を削除する必要があるため、部分文字列の長さが長くなると扱いにくくなります。
少し新しいのは、部分文字列の抽出ですvar2=${var::${#var}-4}
。ここで、の代わりに任意の数を入力4
して、異なる数の文字を削除できます。(${#var}
は文字列の長さに置き換えられるため、これは実際には最初の(長さ-4)文字を保持するように求めています。)
新しいバージョンのbash(具体的には4+、つまりMacOSに同梱されているバージョンが機能しないことを意味します)では、これをに単純化できますvar2=${var::-4}
。
実際にbashを使用していないが、他のPOSIXタイプのシェルを使用している場合、サフィックスの削除は、通常の古いダッシュ(他のどれも使用できない)でも機能します。zshではすべて機能しますが0
、コロンの間にaを置くvar2=${var:0:-4}
必要があります。など。kshでは、0が必要で、明示的な長さ4の式を使用する必要もあります。var2=${var:0:${#var}-4}
。
もちろん、ユーティリティプログラムを使用してコマンド置換を行うこともできます。うまくいくものはたくさんありますが、のようなものvar2=$(cut -c -4 <<<"$var")
がおそらく最も短いオプションです。
あなたはこのようにすることができます:
#!/bin/bash
v="some string.rtf"
v2=${v::-4}
echo "$v --> $v2"
bash
4+ですが、以前のバージョンでは少し長く使用できます${v::${#v}-4}
。
${v::-4}
croaksで「zsh:閉じ中かっこが必要です」。しかし、以下の@fredtantiniの答えはうまくいき${v:0:-4}
ます。
文字列の末尾から4文字を削除するには、を使用します${var%????}
。
最終.
使用後にすべてを削除するには${var%.*}
。
${var#????}
。
私のために働いたのは:
echo "hello world" | rev | cut -c5- | rev
# hello w
しかし、ファイル内の行をトリミングするためにそれを使用したので、見苦しく見えます。実際の用途は次のとおりです。
cat somefile | rev | cut -c5- | rev
cut
開始位置からトリミングするまでしか得られませんが、可変長の行が必要な場合は悪いことです。したがって、このソリューションrev
は文字列を逆転()し、終了位置に関連付けてから、cut
前述のように使用し、それをrev
元の順序に(再び)逆転させます。
rev
文字列ではなく行を反転します。echo $SOME_VAR | rev | ...
おそらく期待どおりに動作しません。
変数の展開/部分文字列の置換を使用:
$ {var /%Pattern / Replacement}
varのサフィックスがパターンに一致する場合、パターンを置換に置き換えます。
だからあなたはできる:
~$ echo ${var/%????/}
some string
または、
あなたがいつも同じ4文字を持っているなら
~$ echo ${var/.rtf/}
some string
常に末尾が.xyz
次の場合:
~$ echo ${var%.*}
some string
文字列の長さを使用することもできます。
~$ len=${#var}
~$ echo ${var::len-4}
some string
または単に echo ${var::-4}
len=${#var}; echo ${var::len-4}
短縮できますecho ${var:0:-4}
:-)編集:または@iyonizerが指摘したように、ただecho ${var::-4}
...
以下の例が役立つことを願って、
echo ${name:0:$((${#name}-10))}
-> ${name:start:len}
start
文字列の開始点ですlen
削除する必要がある文字列の長さです。例:
read -p "Enter:" name
echo ${name:0:$((${#name}-10))}
出力:
Enter:Siddharth Murugan
Siddhar
注:Bash 4.2は負の部分文字列のサポートを追加しました