質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

3回答

5978閲覧

sed で変数に代入されている&等のメタ文字のエスケープ処理を行いたい

anzii

総合スコア18

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

1クリップ

投稿2017/08/28 14:01

前提

sed でファイルの中身を置き換える処理をシェルで行っています。
その際に変数に格納された文字列の中に&が入っていた場合に置換後
の文字列の中に置換前の文字列が入ってしまします。

現在の状況

変数 $test に hoge&huga という文字列が格納されていると仮定し
test.txt には aa という文字だけが書かれているとした場合

sed s/aa/$test/g test.txt を行うと
test.txt の中身は hogeaahuga となってしまう

実現したいこと

sed の仕様として & は上記の処理になるのは正しいことは理解しているのですが
随時変わる変数の中に & 等のメタ文字が混入している場合にエスケープ処理をする
ことはできないでしょうか?

どなたか詳しい方、ご教授お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

sedを使わずにbashの文字列置換機能を使用してはどうでしょう。

bash

1test="hoge&fuga" 2str="##aa##" 3 4echo ${str//aa/$test}
##hoge&fuga##

shとbashでの変数内の文字列置換など

投稿2017/08/29 13:34

編集2017/08/29 13:56
SVC34

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anzii

2017/08/31 12:44

ご回答ありがとうございます。 bashに文字列置換の機能があったんですね! 初めて知りました。勉強になります。 今回は sed での置換にしました。 こちらの処理も試してみます。
guest

0

ベストアンサー

力技ではありますが、変数を事前にエスケープすれば、一応対処できました。

bash

1vagrant@remi7:~$ cat a.sh 2#!/bin/bash 3test='hoge&huga' 4echo "test=$test" 5echo aa > test.txt 6echo -n test.txt= 7cat test.txt 8r1=$(sed -e "s/aa/$test/g" test.txt) 9echo r1=$r1 10 11test=$(echo $test | sed -e 's/\&/\\&/') 12echo "test=$test" 13r2=$(sed -e "s/aa/$test/g" test.txt) 14echo r2=$r2 15

bash

1vagrant@remi7:~$ sh a.sh 2test=hoge&huga 3test.txt=aa 4r1=hogeaahuga 5test=hoge\&huga 6r2=hoge&huga 7vagrant@remi7:~$ 8

投稿2017/08/29 00:34

hotta

総合スコア1613

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anzii

2017/08/31 12:39

ご回答ありがとうございます。 教えていただいた通り echo $変数 | sed -e 's/\&/\\&/' したところ&を文字列としてエスケープすることができました。 ありがとうございました。
guest

0

特殊文字は"&"の他に\1~\9もあるようですが、
"&"のエスケープは下記のようにできました。

sh

1test='hoge&fuga' 2test=`echo ${test} | sed 's/&/\\\&/g'` 3echo "aa bbcc aabb cc" | sed "s/aa/${test}/g" 4 5# => hoge&fuga bbcc hoge&fugabb cc

投稿2017/08/29 00:19

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anzii

2017/08/31 12:41

ご回答ありがとうございます。 `echo ${test} | sed 's/&/\\\&/g'`で エスケープ処理ができました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問