回答:
「パラメータ拡張」とbashで$ {parameter:offset:length}
$ var=abcdef
$ echo ${var:0:1}
a
$ echo ${var:3:1}
d
編集:パラメータ展開なし(あまりエレガントではないが、それが最初に私に来たものです)
$ charpos() { pos=$1;shift; echo "$@"|sed 's/^.\{'$pos'\}\(.\).*$/\1/';}
$ charpos 8 what ever here
r
echo ${var: -2:1}
zsh
ていmksh
ます。
パラメーター展開の代替手段は expr substr
substr STRING POS LENGTH
substring of STRING, POS counted from 1
例えば:
$ expr substr hello 2 1
e
substr
ますが、FreeBSD、NetBSDまたはOS Xのexprには含まれていません。これは移植性のあるソリューションではありません。
substr
元々はGNU拡張ではないことに注意してください。の最初の実装はexpr
、70年代後半にPWB Unixから来て、持っていましたsubstr
(ではありません:
)。
cut -c
変数に改行が含まれていない場合は、次を実行できます。
myvar='abc'
printf '%s\n' "$myvar" | cut -c2
出力:
b
awk substr
変数に改行がある場合でも機能する別のPOSIXの代替手段です。
myvar="$(printf 'a\nb\n')" # note that the last newline is stripped by
# the command substitution
awk -- 'BEGIN {print substr (ARGV[1], 3, 1)}' "$myvar"
出力:
b
printf '%s\n'
エスケープ文字に関する問題を回避することです:https : //stackoverflow.com/a/40423558/895245例:
myvar='\n'
printf '%s\n' "$myvar" | cut -c1
\
期待どおりに出力します。
参照:https : //stackoverflow.com/questions/1405611/extracting-first-two-characters-of-a-string-shell-scripting
Ubuntu 19.04でテスト済み。
printf '%s' "$myvar" | cut -c2
改行文字で終了しprintf
ない限り、の出力はテキストではないため、POSIXではありません$myvar
。それ以外の場合は、入力の各行をcut
カットするときに変数に改行文字が含まれないと想定します。
awk
一つはとのより効率的で信頼性の高いだろうawk -- 'BEGIN {print substr (ARGV[1], 2, 1)}' "$myvar"
cut
(のmawkやbusyboxののawkのために同じ)マルチバイト文字のための仕事をしない、
printf 'abc '| cut -c2
いいえ\n
(これは私は知りません)のために間違っているのですか、myvarに改行があるとコマンドが失敗するのですか(これは同意します)?
cut
入力がテキストでない場合の動作は指定cut
されていません(ただし、行または任意の長さを処理するには実装が必要です)。の出力は改行文字で終わらないため、テキストでprintf abc
はありません。実際には、実装に応じて、それをにパイプすると、のいずれかが得られるか、まったく得られません。あなたは、必要があると思います(のは、出力に必要なことをPOSIXによって指定された動作を取得するために)cut -c2
b
b<newline>
printf 'abc\n' | cut -c2
b<newline>
zsh
かyash
、あなたが使用したいです:
$ text='€$*₭£'
$ printf '%s\n' "${text[3]}"
*
(でzsh
短縮できますprintf '%s\n' $text[3]
)。
cutコマンドを使用できます。3番目の位置を取得するには:
echo "SAMPLETEXT" | cut -c3
このリンクを確認してくださいhttp://www.folkstalk.com/2012/02/cut-command-in-unix-linux-examples.html
(高度な場合)ただし、特に入力にスペースが含まれる場合は、IFSを変更することも良いことです。その場合のみ、以下のものを使用してください
saveifs=$IFS
IFS=$(echo -en "\n\b")
echo "SAMPLETEXT" | cut -c3
IFS=$saveifs
IFS
あなたが投稿したコードでは、どのように作用するかわかりません。