ラベル バックスラッシュ の投稿を表示しています。 すべての投稿を表示
ラベル バックスラッシュ の投稿を表示しています。 すべての投稿を表示

2018年7月21日土曜日

シェルスクリプト 文字列から直前に\(バックスラッシュ)が無い"(二重引用符)までを削除する

2018 Jul. 21.

Srch=$(echo $Line | grep -oP '^.*?\\".*?[^\\]"' | sed -e 's/\\/\\\\/g')
echo $Line | sed -e s/${Srch}//

「直前に\(バックスラッシュ)が無い"(二重引用符)まで」の検索
  原形 ^.*?\".*?[^\]"
  grepに使う時 '^.*?\\".*?[^\\]"'
  sedに使う時 '^.*?\\".*?[^\\]"'

sedの検索文字列内での\(バックスラッシュ)
  '(シングルクォーテーション)で囲むと
    シェルではそのまま読み込まれて
    sedにおいて\(バックスラッシュ)が状況に応じてエスケープ文字に解釈される

  '(シングルクォーテーション)で囲まないと
    シェルで読み込まれる時に\が状況に応じてエスケープ文字に解釈され
    sedにおいても\が状況に応じてエスケープ文字に解釈される
    \をたくさん書く必要がある

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 (期待どおり)

2018年7月17日火曜日

grep 文字列の先頭から、直前に\が無い"(二重引用符)までの文字列の最短一致検索

2018 Jul. 20.
2018 Jul. 19.
2018 Jul. 17.

文字列の先頭から、直前に\(バックスラッシュ)が無い"(二重引用符)までの文字列の最短一致検索

$ grep -oP '^.*?\\".*?[^\\]"'

 -P で最短一致が可能なPearl正規表現とし、検索文字列中の?で最短一致指定、-o で一致文字列を出力

変数への結果格納
$ Result=$(echo $Str | grep -Po '^.*?\\".*?[^\\]"')