先頭または末尾から最も長い連続した文字列を削除します

先頭または末尾から最も長い連続した文字列を削除します

たとえば、文字列が aaaaabbaabaabbaa の場合、先頭から「b」まですべての「a」を削除するようにトリミングすると、結果は bbaabaabbaa になります。

答え1

セクションをご覧くださいパラメータ拡張そしてパターンマッチングman 1 bash

$ shopt -s extglob # enable extended glob operators
$ s=aaaaabbaabaabbaa
$ echo "${s##*(a)}"
bbaabaabbaa

$ s=bananasssssssss
$ echo "${s%%*(s)}"
banana

答え2

GNUの場合sed:

sed -e 's/^\(.\)\1\{1,\}//'

行の先頭で少なくとも 1 回繰り返される文字と一致して削除されます。これは、^\(.\)最初の文字を一致させるために使用し、次に\1\{1,\}その一致への後方参照を使用して 1 つ以上の文字を一致させるために使用します。

最初の文字の 1 回以上の繰り返しのみを一致させたい場合は、 だけを使用できますsed -e 's/^\(.\)\1\+//'が、\{1,\}必要に応じて 2 回以上や 3 回以上などに簡単にフォームを変更できます。

答え3

たった2行です:

$ a="aaaaabbaabaabbaaddd" 
$ echo "${a#"${a%%[^"${a:0:1}"]*}"}"
bbaabaabbaaddd

アクションの説明:

                  "${a:0:1}"         ## Select the first char of $a: ='a'
                [^          ]*       ## All chars not 'a' from the end. ='bbaabaabbaaddd'
          "${a%%              }"     ## Remove 'bbaabaabbaaddd' from the end of $a. ='aaaaa'  
echo "${a#                      }"   ## Remove 'aaaaa' from start of $a and echo it.

(-)どちらの展開でも、* と / を正しく処理するには引用符が必要です。バッククォートは通常、正しく処理されないという問題が残っています。

a="\\\\*\\\\*****vdf*"; echo "${a#"${a%%[^"${a:0:1}"]*}"}"

印刷されます:

*\\*****vdf*

最初の繰り返し文字列は正しく削除されましたが、次の 4 つのバックスラッシュは 2 つだけに変換されました。

関連情報