rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

シェルスクリプト 文字列から先頭の1文字を削除した上で、直前が\もしくは"ではない"までを最短一致で削除する

2018 Jul. 21.

bash上で、文字列Lineから先頭の1文字を削除した上で、直前が\もしくは"ではない"までを最短一致で削除する

LeftLine=${Line:1:$*1}  # 先頭文字削除
DelStr=$(echo $LeftLine | grep -oP -e '^.*?[^\\"]"[^"]')  # 最短一致削除文字列取得
DelStr=${DelStr/%?/}  # 余分に取得した末尾文字を削除
DelStr=$(echo $DelStr | sed -e 's/\\/\\\\/g')  # \を\でエスケープし\\に
echo $LeftLine | sed -e s/${DelStr}//  # 削除実行

${parameter/pattern/string}
パターンの置換。 pattern が展開され、 パス名展開の場合と同じようなパターンを作ります。 parameter の展開が行われ、 その値のうち pattern に最長一致する部分が string に置換されます。 pattern が / で始まる場合には、pattern に マッチした部分は全て string に置換されます。 そうでない場合には、最初にマッチした部分だけが置換されます。 pattern が # で始まる場合には、パターンは parameter を展開した値の先頭にマッチしなければなりません。 pattern が % で始まる場合には、パターンは parameter を展開した値の末尾にマッチしなければなりません。 string が空の場合には pattern にマッチした部分は削除されます。 またこの場合には、pattern の後に続く / は省略可能です。 parameter が @ または * である場合、置換操作は全ての位置パラメータに順番に適用され、 展開結果はリストとして得られます。 parameter が @ または * が添字になっている配列変数である場合、 置換操作は配列の全ての要素に順番に適用され、 展開結果はリストとして得られます。

*1: ${#Line} - 1