sedの文字列置換トラブル

以上のフォーラム以外のトラブル

モデレータ: 暇人, YoN, nyu

返信する
アバター
ミトじい
記事: 162
登録日時: 13/09/19(木) 08:43
お住まい: 埼玉県 K市 南O

sedの文字列置換トラブル

投稿記事 by ミトじい »

コード: 全て選択

#!/bin/sh
TARGETDIR=$(echo "$@" | sed -e "s/ /\?/g")
echo "$@"
echo ${TARGETDIR}

コード: 全て選択

#!/bin/sh
TARGETDIR=$(echo "$@" | sed -e "s/ /\*/g")
echo "$@"
echo ${TARGETDIR}
これらをそれぞれ test1.sh , test2.sh として端末で実行すると、意図した変換が出来ないのですが何故でしょう?
sed_trbl2.png
空白をワイルドカードに変換しようとしているだけなんですが… :?
tahr64-606simple の sed 4.2.2 で実行してます
添付ファイルを見るにはパーミッションが必要です
最後に編集したユーザー ミトじい [ 18/04/13(金) 06:18 ], 累計 1 回
machine: PC-VN770WG1YW(customed) [4x intel core-i5 M460 2.53GHz, ram: 8GB]
main OS: bionic64-simple-r2 <- special thanks Mr. thinkpadnerd m(_ _)m
sub OS: linux mint, win10(Pro), win7(HP+SP1), android-x86, …
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

Re: sedの文字列置換トラブル

投稿記事 by ルビー »

sedは正しい仕事をしているので、不具合ではありません。
シェル(bash)のワイルドカード展開の処理の問題です。
でも、bashも仕様通りの動きをしているので、bashも悪くないです。

スクリプトの実行結果がコロコロ変わるので、不思議に思ったのでしょうが、スクリプトを走らせた時のカレントディレクトリに、引数で渡した名前のファイルかディレクトリを置いてなかったですか?

ワイルドカードの展開具合で、出力結果が変化しているのだと思います。
私は、このファイルの有無で、添付画像通りの出力を再現できました。

bash はまずカレントの(フルパスならその通りの)ディレクトリを調査して、ワイルドカードに該当するファイル(ディレクトリ)名を展開します。
該当するファイルが無ければ、ワイルドカードのままになります。

意図的にワイルドカードの展開をさせたくなければ、シングル(')、ダブルクォート(")で囲みます。

この辺の挙動は説明を読んでもなかなか分かりづらいですが、echo で簡単な実験をすると分かりやすいです。

1. カレントに、usagi.txt kame.txt tanuki.txt などと適当にファイルを作る
2. echo *.txt 実行
3. 1, のファイルを他に移動して、echo *.txt 実行
4. 上記を echo "*.txt" で試す

私は、sedを使う時はスクリプトファイルにして使うので、ワンライナー的な使い方はあまりやりませんが、sedで気が付いた事です。
・sedのコマンドを囲むのは、シングルクォートの方が安全
・コマンド一つだけの時は、-e オプションを省略可能
・置換文字列の、? * はエスケープ不要
最後に編集したユーザー ルビー [ 18/04/14(土) 11:05 ], 累計 1 回
アバター
ミトじい
記事: 162
登録日時: 13/09/19(木) 08:43
お住まい: 埼玉県 K市 南O

Re: sedの文字列置換トラブル

投稿記事 by ミトじい »

お騒がせしました :oops:
最後の行
 echo ${TARGETDIR}
で、置換後のワイルドカード文字列が評価されてるのに気づきませんでした
 echo "${TARGETDIR}"
で、想定どおりの結果になりました

ご指摘のようにカレントに引数で指定したファイルを作ってました
あまりスクリプトに慣れてないせいか、変数の中身やシェルの評価動作を失念することがよくあります
やはり初心者に正規表現は鬼門ですねぇ
sed とか find とか使いこなせれば便利なんでしょうけど、苦手意識があるせいでちょっと複雑な処理をしようすると、つい慣れてる(つもりの)Cでプログラム組んじゃおうかと目論んだりしちゃいます
いえ、できるかどうかは実力的にまた別の問題なんですが(;^_^A

webページをブラウザで考えなしにローカルに保存したりすると、ファイル名に空白はおろか、?や*の入ったファイルがポコポコできたりするので、そういったファイル達をリストアップして一括リネームすることを考えているんですが、先は長そうです( -.-) =з

ご指南有難うございました
またよろしくお願いしますm(_ _"m)

※ルビーさんのご指摘どおり表題の「不具合」はよろしくないと思ったのですが、うまい言葉が浮かばないのでとりあえず「トラブル」と変更してみましたがいかがでしょう?
内容を考えたら「sed」のせいでもないから外すべきでしょうか?
(最初の投稿記事でトピック名を変更できるのを初めて知りました :oops:
machine: PC-VN770WG1YW(customed) [4x intel core-i5 M460 2.53GHz, ram: 8GB]
main OS: bionic64-simple-r2 <- special thanks Mr. thinkpadnerd m(_ _)m
sub OS: linux mint, win10(Pro), win7(HP+SP1), android-x86, …
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

Re: sedの文字列置換トラブル

投稿記事 by ルビー »

ミトじい さんが書きました:やはり初心者に正規表現は鬼門ですねぇ
sed とか find とか使いこなせれば便利なんでしょうけど、苦手意識があるせいでちょっと複雑な処理をしようすると、つい慣れてる(つもりの)Cでプログラム組んじゃおうかと目論んだりしちゃいます
ミトじいさんが初心者だったら、初心者って何?になっちゃいますよ(^^;。
これからLinuxを使ってみたい人の心を砕くかもしれない。

正規表現などと言う物は、誰に取ってもややこしい物です。
それに価値を見出すかは、必要な環境に居るか居ないかだと思います。

私はシェルスクリプトよりも、C言語書ける人の方が偉いと思う。
昔、VZ使いの人(通じますよね)に、sedのスクリプト書く方が難しいと言われて意外に思いました。
私は、VZマクロ書けないので、そっちの方が難しいと思ってましたが、sedのコマンドは一文字コマンドなので、その羅列を見ても分かりづらいとの事でした。
ふ~ん、そう言う物なのかと、ちょっと意外でした。

タイトルは、今ので良いのじゃないでしょうか。
sed君は間違ってないけれども、sedのややこしさも一因なのだし。
同じ様な事に嵌る人は、これからも居ますから。
昔の情報源は書籍だったから、何度ドツボに嵌って泣いたか知れないです。
ミトじい さんが書きました:(最初の投稿記事でトピック名を変更できるのを初めて知りました :oops:
私も、たぶん知らない事が一杯ありそうです。
投稿後に自由に書き換えられる仕様も、どうなのだろうって思う時があります。
ニフティサーブの様に書き換え不可の方が、いいような気もします。
その方が、慎重に考えて書くし、恥ずかしい事を書いても、あきらめがつきます(^^;。
返信する