操作したい文字列があります。文字列はH08W2345678
です。どのように操作すれば、出力はW2345678
になりますか?
同様に、H08W2345678
から最後の4文字を削除してH08W234
を取得したい場合、どうすればよいですか?
Bash(またはksh93
その構文の由来またはzsh
):
string="H08W2345678"
echo "${string:3}"
W2345678
echo "${string:0:-4}"
H08W234
文字列操作 の詳細については、Wooledge wikiを参照してください。
$ echo "H08W2345678" | sed 's/^.\{3\}//'
W2345678
sed 's/^.\{3\}//'
は、^.\{3\}
によって最初の3文字を検索し、空白に置き換えます。ここで、^.
は文字列の先頭の任意の文字に一致し(^
は文字列の先頭を示します)、\{3\}
は直前のパターンに正確に3回一致します。したがって、^.\{3\}
は最初の3文字と一致します。
$ echo "H08W2345678" | sed 's/.\{4\}$//'
H08W234
同様に、sed 's/.\{4\}$//'
は最後の4文字を空白に置き換えます($
は文字列の終わりを示します)。
すべての行が11文字(または何でも)の文字列であり、切り詰めたいファイルがある場合、sed
が使用するツールです。単一の文字列を操作するのは問題ありませんが、やり過ぎです。単一の文字列の場合、bashバージョン4.2以降にアクセスできる場合、おそらく Jasonの回答 が最適です。ただし、${parameter:offset}
および${parameter:offset:length}
構文は、bash(well、bash、ksh93、mksh、およびzsh)に固有であるように見えます—私はそれらを表示しません Open Group Base Specificationsシェルコマンド言語の場合 。サブストリング拡張(抽出)をサポートしていないPOSIX準拠のシェルでスタックしている場合は、
$ printf "%s\n" "${string#???}"
W2345678
$ printf "%s\n" "${string%????}"
H08W234
printf
の代わりにecho
を使用して、abc-e
のような文字列から保護します。最初の3文字をドロップすると、-e
(およびecho -e
はあなたが望むことをしません)。
また、Bourneファミリーシェルをまったく使用していない場合(または、POSIX以前のシステムを使用している場合)でも、これらは動作するはずです。
$ expr " $string" : ' ...\(.*\)'
W2345678
$ expr " $string" : ' \(.*\)....'
H08W234
追加の先行スペースは、実際のexpr
演算子である$string
の値の問題を回避するためのものです(例:+
、/
、index
またはmatch
)またはオプション(例:--
、--help
または--version
)。
と:
string="H08W2345678"
3文字または4文字の一致は単純なようです(ほとんどのシェルの場合)。
$ printf '%s\t%s\n' "${string#???}" "${string%????}"
W2345678 H08W234
古いシェル(Bourne Shellなど)の場合は、次を使用します。
$ string=H08W2345678
$ expr " ${string}" : " ...\(.*\)"
W2345678
$ expr " ${string}" : " \(.*\)...." '
H08W234
文字の数値カウントが必要な場合は、以下を使用します。
$ expr " ${string}" : " .\{3\}\(.*\)"
W2345678
$ expr " ${string}" : " \(.*\).\{4\}" '
H08W234
もちろん、これらの正規表現はsed、awk、bash 3.0以降でも機能します。
$ echo "$string" | sed 's/^.\{3\}//'
W2345678
$ echo "$string" | sed 's/.\{4\}$//'
H08W234
$ echo "$string" | awk '{sub(/^.{3}/,"")}1'
W2345678
$ echo "$string" | awk '{sub(/.{4}$/,"")}1'
H08W234
$ r='^.{3}(.*)$'; [[ $a =~ $r ]] && echo "${BASH_REMATCH[1]}"
W2345678
$ r='^(.*).{4}$'; [[ $a =~ $r ]] && echo "${BASH_REMATCH[1]}"
H08W234