前後の最長連続文字シーケンスを削除します。

前後の最長連続文字シーケンスを削除します。

たとえば、文字列には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回以上一致させる場合にのみ使用できますが、必要に応じて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つに変換されます。

関連情報