プロが教えるわが家の防犯対策術!

UTF-8、Shift-JIS、EUC-JPで書かれた、meme_utf8、meme_sjis、meme_eucという名前のテキストファイルがあるのですが、

$ for f in meme_*; do nkf $f; done
で以下のような出力になるのですが、

我が生涯に一片の山田なし!
古池や田代飛びこむ水の音
上田は人を傷つける、いつだって
田代にきずくとは...やはり天才か
ざんねんながら中村はきえてしまいました
この後、衝撃の上田が!!
中村をセンターに入れてスイッチ...
守りたい、この山田
我思う、ゆえに上田あり

$ for f in meme_*; do nkf $f | sed "s/^/$f /"; done
で以下のようなにファイル名を各行の頭に付加した結果になるのですが、

meme_euc 我が生涯に一片の山田なし!
meme_euc 古池や田代飛びこむ水の音
meme_euc 上田は人を傷つける、いつだって
meme_sjis 田代にきずくとは...やはり天才か
meme_sjis ざんねんながら中村はきえてしまいました
meme_sjis この後、衝撃の上田が!!
meme_utf8 中村をセンターに入れてスイッチ...
meme_utf8 守りたい、この山田
meme_utf8 我思う、ゆえに上田あり

sed "s/^/$f /"の動作で何故上のような出力になるのか理屈が分かりかねています。
どなたか分かる方、ご教示ください。

A 回答 (2件)

シェルにて以下の命令が打ち込まれた


sed "s/^/$f /"

シェルによるパラメータ展開が行われ、シェル変数 f が置き換わる
sed "s/^/meme_euc /" ← ファイル meme_euc を処理している場合

シェルは置き換え後の値を引数にして、プログラム sed を実行する
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2022/10/10 19:57

"s/^/$f /" は " でくくられているので、sedを実行する前にシェルによって展開が行なわれいます。


$f は 正規表現としてsedで処理される前に、変数f の内容に展開されます。

for f in meme_*;

for f in meme_euc meme_sjis meme_utf8;
になり、 変数f を meme_euc meme_sjis meme_utf8 と変えながらループするので
nkf meme_euc | sed 's/^/meme_euc /'
nkf meme_sjis | sed 's/^/meme_sjis /'
nkf meme_utf8 | sed 's/^/meme_utf8 /'
を実行することになります。


set -x を実行すると、以降は展開後のコマンドが表示されるようになります。
どのように展開されるか等を知りたいときに設定するとよいでしょう。
    • good
    • 0
この回答へのお礼

詳しいご説明ありがとうございます。

お礼日時:2022/10/10 19:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!