問. 下記の変数HENKAN_MOJIにおける「open」を、変数SUBSTIDUTE_CHARにおける「\|/」へ変換せよ
- HENKAN_MOJI='left_open_right'
- SUBSTIDUTE_CHAR='\|/'
- (正値) HENKAN_MOJI=left_\|/_right
失敗例 〜 いつものやり方 〜
HENKAN_MOJI='left_open_right'
SUBSTIDUTE='\|/'
echo "${HENKAN_MOJI}" | sed 's/open/'${SUBSTIDUTE}'/g')
`s' に対するオプションが不明です
「\|/」の「/」が置換対象変数内の区切り文字である「/」と重なり、エラーとなる
かといって、区切り文字を「|」にして、
sed 's|open|'${SUBSTIDUTE}'|g'
としようにも、置換対象変数内に「|」があるため同様のエラーとなる
解決法 〜 特殊記号を他の文字列に置き換える 〜
HENKAN_MOJI='left_open_right'
SUBSTIDUTE='\|/'
SUBSTIDUTE=$(echo "${SUBSTIDUTE}" | sed 's/[|]/CHAR_VERTICAL_VAR/g' | sed 's/[/]/CHAR_SLASH/g' | sed 's/[\]/CHAR__BACK_SLASH/g')
HENKAN_MOJI=$(echo "${HENKAN_MOJI}" | sed 's/open/'${SUBSTIDUTE}'/g')
HENKAN_MOJI=$(echo "${HENKAN_MOJI}" | sed 's/CHAR_VERTICAL_VAR/\|/g' | sed 's/CHAR_SLASH/\//g' | sed 's/CHAR__BACK_SLASH/\\/g' | sed 's/*right/text/g')
echo "${HENKAN_MOJI}"
--> left_\|/_right
三行目で**「\」「|」「/」を文字列「CHAR_VERTICAL_VAR」「CHAR_SLASH」「CHAR__BACK_SLASH」に置き換えている**
これさえ、できれば四行目で普通に「open」を変換できる。
あとは、「\」「|」「/」へ戻すのを忘れずに。
この方法の利点
万能である。
他の特殊記号(「(」「)」「[」「]」「{」「}」「'」「"」「`」等etc)であっても、変換可能。
ただでさえ、「|」が変数内に含まれると、そうそう使える区切り文字がないので。
これで、ただでさえ、便利なsedライフを。
余談と題して、宣伝
こんなテクニックを駆使してコマンドにおける特殊記号をフルに扱えるアプリを作ってみた
名付けて
コマンドクリック
例えば、docker-comopse up -f /home/example/Desktop/share/projedtA/production.yml up -d
等の面倒なコマンドをクリック一発でターミナルへ送れる
Ubuntu系Linux限定にて、公開中。