web-dev-qa-db-ja.com

文字列の前から文字を「ドロップ」/削除する方法は?

操作したい文字列があります。文字列はH08W2345678です。どのように操作すれば、出力はW2345678になりますか?

同様に、H08W2345678から最後の4文字を削除してH08W234を取得したい場合、どうすればよいですか?

13
3kstc

Bash(またはksh93その構文の由来またはzsh):

string="H08W2345678"

echo "${string:3}"
W2345678

echo "${string:0:-4}"
H08W234

文字列操作 の詳細については、Wooledge wikiを参照してください。

19
jasonwryan
$ 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文字を空白に置き換えます($は文字列の終わりを示します)。

8
heemayl

すべての行が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)。

2
Scott

と:

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
0
Isaac