- シェルスクリプト総合 その28
159 :デフォルトの名無しさん[sage]:2018/08/17(金) 08:44:27.28 ID:TmUZ5Zjz - パターン文字列をsedで置換しちゃうとか(GNU sed の場合)
$ pattern='foo[1]' $ sed "s/$(sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g' <<< "${pattern}")/foo[2]/g" <<< 'foo[1]' foo[2]
|
- シェルスクリプト総合 その28
165 :デフォルトの名無しさん[sage]:2018/08/17(金) 09:16:49.96 ID:TmUZ5Zjz - >>163
ああ、bash じゃなくて ash だから here string("<<<") が使えないのね… # echo 'foo[1]' | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g" こんな感じかな。
|
- シェルスクリプト総合 その28
168 :デフォルトの名無しさん[sage]:2018/08/17(金) 09:57:27.72 ID:TmUZ5Zjz - >>167
う〜ん、ash でやってみたけど、1番目、2番目は問題ないなぁ Busybox の sed は -r オプションがないんじゃなかったかな
|
- シェルスクリプト総合 その28
169 :デフォルトの名無しさん[sage]:2018/08/17(金) 09:58:49.05 ID:TmUZ5Zjz - あ、ごめん勘違いしてた。ちょっと考えてみる
|
- シェルスクリプト総合 その28
171 :デフォルトの名無しさん[sage]:2018/08/17(金) 10:13:01.82 ID:TmUZ5Zjz - あれ?でもさ、
pattern='+' $ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g" foo[2] 入力が '+' でパターン文字列も '+' だから foo[2] に置換されるのは正しいんじゃないかな? でもまぁ、GNU sed で -r オプション付けると `+` 記号がメタキャラクタになるから、付けない場合は `+` を考慮する必要はなかったのね… $ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*^.$/\]|\[|\])/\\\1/g')/foo[2]/g" こっちの方が良いみたい。
|
- シェルスクリプト総合 その28
179 :デフォルトの名無しさん[sage]:2018/08/17(金) 11:32:47.25 ID:TmUZ5Zjz - grep にある -F オプションと同等のオプションが sed にも
欲しいところではあるなぁ。生まれは同じなのに sed には無い のは何故…(実はあったりして)
|