お世話になります。
一度変数に文字列として格納したsedコマンドの実行についての質問です。
以下、「実装1」のように、「あるファイルの最終行を除外して別のファイルに書き込む」という処理を行おうとしています。
ログ出力などの関係で、実行するコマンドを一度変数に格納する必要があるのですが
一度変数に格納して実行すると「実装2」のようにエラーが出てしまいます。
変数に格納したsedコマンドを実行するにはどのようにすればいいでしょうか?
なお、シェルはbashです。
実行例ではターミナルから直接実行していますが、実際にはシェルスクリプトにして実行します。
以上、どなたかご教示頂けないでしょうか。
■実装1
[root@localhost tmp]# cat /tmp/data
aaa
bbb
ccc
[root@localhost tmp]# sed -e '$d' /tmp/data >/tmp/data2
[root@localhost tmp]# cat /tmp/data2
aaa
bbb
[root@localhost tmp]#
■実装2
[root@localhost tmp]# CMD='sed -e $d /tmp/data >/tmp/data2'
[root@localhost tmp]# echo $CMD
sed -e $d /tmp/data >/tmp/data2
[root@localhost tmp]# $CMD
aaa
bbb
sed: >/tmp/data2を読み込めません: そのようなファイルやディレクトリはありません
[root@localhost tmp]#
No.2ベストアンサー
- 回答日時:
No1です。
その理解で合ってます。
それら3処理以外にも * 等のファイルマッチの展開や、" ' \ によるクォート外しとかありますが。
>それら3処理以外にも * 等のファイルマッチの展開や、" ' \ によるクォート外しとかありますが。
なるほど、他の処理については機会があったら調べてみます。
本件解決しましたのでBAとさせて頂きます。
迅速な回答大変有難うございました。
No.1
- 回答日時:
$CMDの変数展開の前にリダイレクトの解釈がされるので、>/tmp/data2 がファイルへのリダイレクト指定で無く、>まで含めたファイル名として扱われます。
変数内のリダイレクトを処理するためには、evalが必要。evalするので$にはクォートが必要。
$ CMD='sed -e \$d /tmp/data >/tmp/data2'
$ echo $CMD
sed -e \$d /tmp/data >/tmp/data2
$ eval $CMD
早々の回答ありがとうございます。
回答頂きました通り、evalコマンドをかませることで動作することを確認致しました。
>$CMDの変数展開の前にリダイレクトの解釈がされるので、>/tmp/data2 がファイルへのリダイレクト指定で無く、>まで含めたファイル名として扱われます。
細かな話で申し訳無いのですが、この部分が理解できていません。
次のような解釈で合っていますでしょうか?(散らかった文章ですいません)
(1)通常シェルは次の順にコマンドを処理する。
・リダイレクトの解釈
・変数の展開
・コマンドの実行
(2)今回の実装2では「リダイレクトの解釈」の時点で$CMDが展開されていなかったため
$CMDのリダイレクト部分は、sedの変数の1つとして扱われた。
(3)evalコマンドを使用することで、上記3処理が2回走り、次のような処理になったためうまく動いた。
・リダイレクトの解釈 … eval $CMDのためリダイレクトなし
・変数の展開 … eval sed -e \$d /tmp/data >/tmp/data2
・コマンドの実行 … ※evalの引数でもう一周
・リダイレクトの解釈 … sed -e $d /tmp/data >/tmp/data2 のためdata2に書き込み
・変数の展開 … 変数なし
・コマンドの実行 … sed -e $d /tmp/data >/tmp/data2
以上、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux cronの@rebootでのdateコマンドの実行につきまして 2 2023/06/11 16:23
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/11 11:05
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/06 13:01
- UNIX・Linux デフォルト値のパラメータ展開 1 2022/08/12 17:34
- Excel(エクセル) エクセルのマクロが途中の行から適用されない 2 2022/07/09 20:25
- Visual Basic(VBA) VBA GetAttrについて教えてください 2 2022/12/22 15:25
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
エクセルVBA:日付データの変換...
-
テキストファイルの結合について
-
printfの%eで指数部分の桁数を...
-
C言語の勉強しています。すみま...
-
【Excel VBA】10進数を2進数に...
-
C#でのswitch文
-
オセロゲーム 2次元配列で困...
-
&ReadParseでフォームの値が取...
-
【sed】変数に設定したコマンド...
-
C言語の勉強しています。すみま...
-
'dataType' 引数を Null にする...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
char str[256]の256の意味は?
-
COBOLのCOMP形式について
-
Excel VBA メール作成について ...
-
バイナリとBCDコード
-
Excel 1セル当りの文字数が2...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
【Excel VBA】10進数を2進数に...
-
int型(2バイト)データの分割
-
pythonでDBのカラム名で取得し...
-
エクセルVBA:日付データの変換...
-
C#でのswitch文
-
linuxのシェルでファイル名に先...
-
C言語の構造体にてバブルソート...
-
c言語での wavファイルの編集(...
-
'dataType' 引数を Null にする...
-
H8/36064を使ったシリアル通信...
-
オセロゲーム 2次元配列で困...
-
10個の実数に対する降順ソート...
-
c言語の多次元配列で1から100ま...
-
c言語 配列から数字だけをint型...
-
matlabのソースコードをpython...
-
Cのプログラムがどうしても動き...
-
テキストファイルの結合について
おすすめ情報