1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

sedコマンド、3行足すだけで万能変換ができるカンペ

Last updated at Posted at 2021-11-23

問. 下記の変数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限定にて、公開中。

image.png

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?