[解決済み] Bashで文字列の最後のx文字にアクセスする
質問
というのは
${string:0:3}
は文字列の最初の3文字にアクセスすることができます。同じように簡単に最後の3文字にアクセスする方法はないでしょうか?
どのように解決するのですか?
の最後の3文字は
string
:
${string: -3}
または
${string:(-3)}
(の間のスペースに注意してください。
:
と
-3
を第一形式とする)。
を参考にしてください。 リファレンスマニュアルのシェルパラメータ拡張機能 :
${parameter:offset}
${parameter:offset:length}
Expands to up to length characters of parameter starting at the character
specified by offset. If length is omitted, expands to the substring of parameter
starting at the character specified by offset. length and offset are arithmetic
expressions (see Shell Arithmetic). This is referred to as Substring Expansion.
If offset evaluates to a number less than zero, the value is used as an offset
from the end of the value of parameter. If length evaluates to a number less than
zero, and parameter is not ‘@’ and not an indexed or associative array, it is
interpreted as an offset from the end of the value of parameter rather than a
number of characters, and the expansion is the characters between the two
offsets. If parameter is ‘@’, the result is length positional parameters
beginning at offset. If parameter is an indexed array name subscripted by ‘@’ or
‘*’, the result is the length members of the array beginning with
${parameter[offset]}. A negative offset is taken relative to one greater than the
maximum index of the specified array. Substring expansion applied to an
associative array produces undefined results.
Note that a negative offset must be separated from the colon by at least one
space to avoid being confused with the ‘:-’ expansion. Substring indexing is
zero-based unless the positional parameters are used, in which case the indexing
starts at 1 by default. If offset is 0, and the positional parameters are used,
$@ is prefixed to the list.
この回答は定期的に閲覧されるので、対処の可能性を追加させてください。
ジョン・リックス
のコメントにあるように、文字列の長さが3より小さい場合。
${string: -3}
は空の文字列に展開されます。もし、この場合
string
を使用することができます。
${string:${#string}<3?0:-3}
これは
?:
三項演算子で、これは
シェル算術
ドキュメントにあるように、オフセットは算術式であるため、これは有効である。
POSIX準拠のソリューションのためのアップデート
前の部分は、最良の選択肢を与えるものです
Bashを使用する場合。
POSIXシェルをターゲットにする場合は、以下のようなオプションがあります(パイプや外部ツールを使用しない
cut
):
# New variable with 3 last characters removed
prefix=${string%???}
# The new string is obtained by removing the prefix a from string
newstring=${string#"$prefix"}
ここで注目すべきは、引用符で囲んだ
prefix
内部
というパラメータ展開があります。に記載されています。
POSIX参照
(セクションの最後)にあります。
以下の4種類のパラメータ展開で、部分文字列の処理を行うことができます。いずれの場合も、パターンの評価には正規表現表記ではなく、パターンマッチング表記(パターンマッチング表記を参照)を使用する。パラメータが'#'、'*'、'@'の場合、展開の結果は不定である。parameter が未設定で、かつ -u が有効な場合、展開に失敗する。パラメータ展開文字列全体を二重引用符で囲むと、以下の4種類のパターン文字が引用されない。 一方、中括弧内の文字を引用すると、この効果がある。 それぞれの品種において、word が省略された場合は、空のパターンが使用されるものとする。
これは、文字列に特殊文字が含まれている場合に重要です。例:(ダッシュで)。
$ string="hello*ext"
$ prefix=${string%???}
$ # Without quotes (WRONG)
$ echo "${string#$prefix}"
*ext
$ # With quotes (CORRECT)
$ echo "${string#"$prefix"}"
ext
もちろん、これは文字数があらかじめわかっている場合にのみ有効です。
?
しかし、そのような場合には、移植性の高いソリューションとなります。
関連
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] バイトを文字列に変換する
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bashで文字列をデリミターで分割するには?
-
[解決済み] Javaで文字列を分割する方法
-
[解決済み】Bashでファイル名と拡張子を抽出する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
パイソンホワイトシステム実践プロジェクト200例(ソースコード付き)、練習が大幅にパイソン(Kunpengプログラミング - Pythonの教育新種)のレベルを向上させることができます。
-
[解決済み] Bashで文字列を小文字に変換する方法は?
-
[解決済み] Bashで文字列を比較する方法
-
[解決済み] 文字列からすべての先頭のスペースを削除するにはどうすればよいですか?- スイフト
-
[解決済み] 変数名が文字列で保存されている場合、変数値を取得する方法は?
-
[解決済み] 文字列の文字数を取得する方法
-
[解決済み] Swift: 列挙型の値を文字列に変換しますか?
-
[解決済み] 文字列を分割して変数に代入する方法
-
[解決済み] Bashで文字列の最後のx文字にアクセスする
-
[解決済み] 関数の引数として、文字列(&String)、Vec(&Vec)、ボックス(&Box)への参照を受け取ることは、なぜ推奨されないのですか?