2018年7月20日金曜日

sedでのバックスラッシュの扱いについて

2018 Jul. 20.
2018 Jul. 19.

sedの s/regexp/replacement/ におけるregexp内の文字としての\には\\とエスケープする必要がある。

ケースA(bash上のsedでうまくいかない)
Str='"wr\"ddadf\"ab",a'
Search='"wr\"ddadf\"ab"'
echo $Str | sed -e s/${Search}//
結果: "wr\"ddadf\"ab",a
(期待していた結果: ,a )

(検索文字列Searchを短くしていくと)
ケースB(うまくいかない)
Str='"wr\"ddadf\"ab",a'
Search='"wr\"ddadf\'
echo $Str | sed -e s/${Search}//
結果: sed: -e expression #1, char 15: `s' コマンドが終了していません

ケースC(Str内の\を\\とエスケープするとうまくいく)
Str='"wr\"ddadf\"ab",a'
Search='"wr\\"ddadf\\'
echo $Str | sed -e s/${Search}//
結果: "ab",a

ケースD(うまくいかない)
Str='"wr\"ddadf\"ab",a'
Search='"wr\"d'
echo $Str | sed -e s/${Search}//
結果: "wr\"ddadf\"ab",a
(期待していた結果: dadf\"ab",a )

ケースE(Str内の\を\\とエスケープするとうまくいく)
Str='"wr\"ddadf\"ab",a'
Search='"wr\\"d'
echo $Str | sed -e s/${Search}//
結果: dadf\"ab",a

ケースF(うまくいかない)
Str='"wr\"ddadf\"ab",a'
Search='"wr\"'
echo $Str | sed -e s/${Search}//
結果: "wr\"ddadf\"ab",a
(期待していた結果: ddadf\"ab",a )

ケースG(Str内の\を\\とエスケープするとうまくいく)
Str='"wr\"ddadf\"ab",a'
Search='"wr\\"'
echo $Str | sed -e s/${Search}//
結果: ddadf\"ab",a

ケースH(うまくいかない)
Str='"wr\"ddadf\"ab",a'
Search='"wr\'
echo $Str | sed -e s/${Search}//
結果: sed: -e expression #1, char 8: `s' コマンドが終了していません
考察:次のケースFとの違いは\なので、\が続く/のエスケープ文字に解釈されているのか?

ケースI(Str内の\を\\とエスケープするとうまくいく)
Str='"wr\"ddadf\"ab",a'
Search='"wr\\'
echo $Str | sed -e s/${Search}//
結果: "ddadf\"ab",a

ケースJ(うまくいく)
Str='"wr\"ddadf\"ab",a'
Search='"wr'
echo $Str | sed -e s/${Search}//
結果: \"ddadf\"ab",a (期待どおり)

0 件のコメント:

コメントを投稿