sedコマンドを使用してファイルの最終行を削除する方法を調べていたのですが
最終行の削除は問題なくできたのですが最終行から特定行までを消すため以下のコマンドを発行したのですがうまくいきませんでした。複数サイトを見てみたんですが構文自体は同じでしたのでおそらく問題ないとは思うですが何か気づく方がいたらお教えください。
以下実行コマンド
sed -e '$-3,$d' sed_test.txt

このQ&Aに関連する最新のQ&A

A 回答 (2件)

sedのマニュアルをいくつか検索してみましたが、 アドレスに「$-3」とすると「最終行の3つ前」になる、と明記しているものは見付けられませんでした。


どこかにそのような記述がありましたか?
    • good
    • 0
この回答へのお礼

回答の程ありがとうございます。
すみません。自己解決できました。
ありがとうございました。

お礼日時:2012/12/17 09:47

これは sed では無理.



「構文自体は同じでしたので」って書いてますけど, 本当に「同じ」ですか? アドレスの与え方も含めて, きちんと確認しましたか?
    • good
    • 0
この回答へのお礼

回答の程ありがとうございます。
すみません。自己解決できました。
ありがとうございました。

お礼日時:2012/12/17 09:47

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q*.txtファイルの最終行だけ参照して、バッチファイルを作りたい

*.txtファイルのなかに"test"という文字をfindstrコマンド又はfindコマンドで探して、出力したいのですが、全ての行を参照して出力するのではなくて、最終行だけを参照して出力するといったバッチファイルを作成したいのですが、どうやればいいのでしょうか?

どうぞよろしくお願いいたします。

Aベストアンサー

tail コマンドを探してきて入れる(インストール)

for %%f in (*.txt) do find "test" %%f | tail -1

QLinux sedコマンド 特定行の置換

こんにちは

テキストファイルの内容をsedコマンドで特定の行の頭に#を付けるようにしたいのですが、
うまくいきません。どのようにしたら良いでしょうか。

--実行前の内容--
* * * * * /tmp/tst.sh
* * * * * /opt/aaa.sh

--想定結果--
#* * * * * /tmp/tst.sh
* * * * * /opt/aaa.sh

Aベストアンサー

No.1の方が聞いてるのは「特定の行とする条件」は何かを聞いているんだと思いますよ

「1行目」だけに#を付けたいのなら↓をどうぞ。
less test.txt | sed -e "1s/^/#/"

QシェルスクリプトのBシェル(Bourne)に出てくる、$0,$1,$2

シェルスクリプトのBシェル(Bourne)に出てくる、$0,$1,$2...のような位置パラメタや、$?,$$,$!,$-のような特殊変数がありますが、これはPerlやRubyもあるようですが、意味や効果、やり方等は同じでしょうか。

当方はPHP,JavaScriptしか触れていませんし、PHPやJavaScriptは、そのような位置パラメタや特殊変数は見当たりませんでした…。

つまり、PerlやRubyはUNIXのコマンドから誕生したスクリプト言語ということでしょうか。

こういった位置パラメタや特殊変数はPerlやRuby以外に他の言語にもありますでしょうか。PythonとかCとかJavaとか…。

また、Bシェルを学んでいる途中ですが、シェルスクリプトの中にはbourne以外にもbashやC Shell,zsh,Perlがありますが、何故Perlが入っているのでしょうか。
Perlをやっている方は別途シェルスクリプトをやる必要はないということでしょうか。

Aベストアンサー

>意味や効果、やり方等は同じでしょうか

意味は、それぞれの言語やスクリプトで違います。

>PHPやJavaScriptは、そのような位置パラメタ


だとしたら、まだ初心者でしょう。存在します。

>PerlやRubyはUNIXのコマンドから誕生したスクリプト言語ということでしょうか

違います。UNIX OSが歴史が深いし、どちらかと言うとコマンドで実行形式が普通だったから普及し、受け入れられる柔軟性が(使っている側とOS側も)あったため、使用する人が増えただけです。

>こういった位置パラメタや特殊変数はPerlやRuby以

あたりまえです。存在します。今はオブジェクト指向が当たり前の世界なので、フレームワークとか外部の物を取り入れたりすると必ず必要になりまよね。

>bourne以外にもbashやC Shell,zsh,Perlがありますが、何故Perlが入っているのでしょうか。

”入っている” と言う意味がよく分かりませんが、たぶんOSに梱包されていて設置すると使えると言う意味でしょう。

まず”シェルスクリプト”のシェルの意味を正しく理解しましょう。下記のURLに妥当な説明があります。その説明を理解しましょう。

http://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%A7%E3%83%AB

ここの引用で
----------------
「コマンドインタプリタ」の名称で呼ばれる場合は単に「コマンドを解釈する者」の意であり、OSのユーザインタフェースとしての意味合いは失われていることが多い。
----------------

となっているとおり、シェルがたくさんあるのはUNIX系OSの歴史でもあります。つまり互換性ですね。バージョンが上がったり、派生型のOSだと、過去の資産を使えない事がかなり痛手です。それで、バージョンを重ねるたびに、そのまま過去のシェルも残り、UNIX(Linuxも含む)の歴史を追従して、オープン化や共有化されています。

それぞれのシェルの中で当然、コマンドが使用できます。その中にPerlも在るだけです。シェルは、コマンドインプリンタとしての役目を果たしているだけです。内部コマンドと、外部コマンドがあるので、外部コマンドの一つがPerlと言うだけです。他のコマンドも同じです。

と言うことで、

>Perlをやっている方は別途シェルスクリプトをやる必要はないということでしょうか。

は、間違いである事が分かりますね。

No1の方もいっていますが、上記の理由でPerlはシェルではありませんね。だからShell Scriptとはならないわけです。単なる「コマンドインタプリタ」であって、OSのユーザーインターフェースではありませんね(シェルではない)。

>意味や効果、やり方等は同じでしょうか

意味は、それぞれの言語やスクリプトで違います。

>PHPやJavaScriptは、そのような位置パラメタ


だとしたら、まだ初心者でしょう。存在します。

>PerlやRubyはUNIXのコマンドから誕生したスクリプト言語ということでしょうか

違います。UNIX OSが歴史が深いし、どちらかと言うとコマンドで実行形式が普通だったから普及し、受け入れられる柔軟性が(使っている側とOS側も)あったため、使用する人が増えただけです。

>こういった位置パラメタや特殊変数はPerl...続きを読む

Qシェルスクリプト bashのtestコマンドが動きません

こんにちは、ど素人なのにシェルスクリプト仕事で書かされ苦しんでます。
SUN-solaris8で動作したシェルをLinuxE3.0へ移動させたら
testコマンドでエラーになりました。

SUN-solaris8ではbsh
LinuxE3.0ではbashです。

test -s file名は両方で認識するようですが、
test -s ../directory名/file名で指定して
実行するとSUNでは動作したのですが
Linuxではわけの分からないメッセージが出て終了。

Linuxで
% sh と打つと/bin/bash
% test と打つと /XXX/usr/binだったかな?パス忘れました。

% man bashでマニュアル見るとtestは[]で囲め?
  英語だから良く分からなかった。
  疲れたので今日は諦めました。

testコマンドで良い解決法ご教示願います。
情報が不足なら指摘いただいた物を追加いたします。

Aベストアンサー

SUNであろうがLinuxであろうが、test -s の後に書けるファイル名は1つだけです。SUNで、test -s *.log が動いていたのはたまたまマッチするファイルが0または1つだけだったのでしょう。

>if test -s XXXX.log || YYYY.log

これは、間違いです。これは、

XXXX.logが存在してファイルサイズが0でなければ、この後のthen部分を実行する。XXXが存在しないか、ファイルサイズが0なら、「 YYYY.log というコマンド」を実行するその結果が真ならその後のthen部分を実行する。

という意味不明の記述です。

何をしたいのか説明文(?)から読み取れないのですが、*.log というファイルが1つ以上あり、それらすべてサイズが0でないということを調べたいのでしょうか?

FLAG=true
for i in *.log
do if test -s $i; then :; else FLAG=false; fi
done
if $FLAG
then echo "すべての *.log ファイルのサイズが非ゼロ"
else echo "*.logが存在しないか、少なくとも一つの *.log ファイルのサイズがゼロ"
fi

SUNであろうがLinuxであろうが、test -s の後に書けるファイル名は1つだけです。SUNで、test -s *.log が動いていたのはたまたまマッチするファイルが0または1つだけだったのでしょう。

>if test -s XXXX.log || YYYY.log

これは、間違いです。これは、

XXXX.logが存在してファイルサイズが0でなければ、この後のthen部分を実行する。XXXが存在しないか、ファイルサイズが0なら、「 YYYY.log というコマンド」を実行するその結果が真ならその後のthen部分を実行する。

という意味不明の記述です。...続きを読む

QFDDを一般ユーザで $ mount /floppy コマンドでマウン

FDDを一般ユーザで $ mount /floppy コマンドでマウント出来るようするにはどうしたらいいのですか?
OSはLinux(debian)、フロッピーのファイルシステムはmsdosです。

sg:~$ mount /floppy と打ち込むと
mount: can't find /floppy in /etc/fstab or /etc/mtab
また
sg:~$ mount /dev/fd0
mount: I could not determine the filesystem type, and none was specified
と出ます。

ftabは、

sg:/etc# vi fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/hda1 / ext3 defaults,errors=remount-ro 0 1
/dev/hda5 none swap sw 0 0
/dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0
/dev/fd0 /media/floppy0 auto rw,user,noauto 0 0

最終行を ↓
/dev/fd0 /media/floppy0 msdos rw,user,noauto 0 0

と書き換えてみたのですが、変になったので元に戻しました。
一般ユーザで $ mount /floppy コマンドでFDDをマウント出来るよう、
アドバイスいただけませんか?
ど素人の質問ですが、よろしくお願いします。

FDDを一般ユーザで $ mount /floppy コマンドでマウント出来るようするにはどうしたらいいのですか?
OSはLinux(debian)、フロッピーのファイルシステムはmsdosです。

sg:~$ mount /floppy と打ち込むと
mount: can't find /floppy in /etc/fstab or /etc/mtab
また
sg:~$ mount /dev/fd0
mount: I could not determine the filesystem type, and none was specified
と出ます。

ftabは、

sg:/etc# vi fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <opt...続きを読む

Aベストアンサー

> sg:~$ mount /dev/fd0
> mount: I could not determine the filesystem type, and none was specified
> と出ます。
このメッセージからすると、
mount -t msdos /media/floppy0
でいいはずですけど。

> /dev/fd0 /media/floppy0 msdos rw,user,noauto 0 0
> と書き換えてみたのですが、変になったので元に戻しました。
どう変になったのかが不明ですけど。



mountをroot権限ではだめでしょうか。
su -
rootパスワードを入れ、マウントします。
は、だめですか。


人気Q&Aランキング

おすすめ情報