1. ホーム
  2. string

[解決済み] Bashで文字列の最後のx文字にアクセスする

2022-04-24 09:33:52

質問

というのは ${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

もちろん、これは文字数があらかじめわかっている場合にのみ有効です。 ? しかし、そのような場合には、移植性の高いソリューションとなります。