はじめまして、以下の実行結果と同じ様になる方法を教えてください。
lang
1$ rpm -qa --queryformat="%{NAME}/%{VERSION}/%{RELEASE}/%{ARCH}\n" '^java*'
--queryformat を使用せず「$ rpm -qa '^java*' | ***」のようにしたいです。想像としてはgrep,split,awkなどを使用し、区切りとして後ろから○○番目の「.」や「-」を「/」に置き換えるのかなとは思うのですが。。。
まだプログラム初心者のため詳しく教えていただけると助かりますのでよろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
Perlのワンライナーであれば以下のようなものでできるかも知れません。
lang
1rpm -qa | perl -nle 'my $target = $_; my $dot = rindex($target, q|.|); my $hyphen = rindex($target, q|-|); my $hyphen2 = rindex(substr($target, 0, $hyphen), q|-|); print join(q|/|, (substr($target, 0, $hyphen2), substr($target, $hyphen2 + 1, $hyphen - $hyphen2 - 1), substr($target, $hyphen + 1, $dot - $hyphen - 1), substr($target, $dot + 1)));'
awkでも同じようなことはできると思います。
量が多いので、ワンライナーではなくて、スクリプトファイルにして実行した方がすっきりするとは思いますが…
参考までにPerlスクリプトとして書いてみるとこんな感じです。(ワンライナーに改行とかインデントが入っただけですが…)
lang
1#!/bin/env perl 2use feature 'say'; 3 4while (my $target = <>) { 5 chomp $target; 6 my $dot = rindex($target, q|.|); 7 my $hyphen = rindex($target, q|-|); 8 my $hyphen2 = rindex(substr($target, 0, $hyphen), q|-|); 9 say join(q|/|, ( 10 substr($target, 0, $hyphen2), 11 substr($target, $hyphen2 + 1, $hyphen - $hyphen2 - 1), 12 substr($target, $hyphen + 1, $dot - $hyphen - 1), 13 substr($target, $dot + 1) 14 )); 15} 16 17exit 0;
- shebang(1行目)は環境によって違うので読み替えてください。
- chompとsayはOSの改行コードと違う改行コードを扱いたい場合にはこのままでは使えないかと思います。
投稿2014/11/09 13:04
総合スコア1356
0
perlコマンドを使っても問題なければ、以下のような感じでできるかも知れません。sedコマンドでもできるとは思いますが…
lang
1rpm -qa | perl -pe 's#^(.*?)-([^\-]*)-([^\-]*).([^.]*)$#$1/$2/$3/$4#g'
※複数の置換が必要な場合はカンマ区切りで複数書けます。(s
~g
の部分をカンマ区切りで追加できます。)
ただ、状況によって最適なコマンドは違ってくるので、常に同じコマンドを使えばできるというものではないと思います。
個人的にはTSV形式にしてからawk -F '\t'
で処理するというのをよくやります。
sedコマンドでも同じことをやってみました。
lang
1rpm -qa | sed -E 's/^(.*?)-([^\-]*)-([^\-]*).([^.]*)$/\1/\2/\3/\4/g'
投稿2014/11/09 08:21
総合スコア1356
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/11/09 12:08
2014/11/09 12:16
2014/11/10 01:15
0
強引な方法ですが、次のようにして可能です。以下をご覧ください。
(VirtualBox 上での CentoS65 でためしています)
rpm -qa | grep '^gnu' gnupg2-2.0.14-6.el6_4.x86_64 gnutls-2.8.5-14.el6_5.x86_64 $ rpm -qa | grep '^gnu' | tr '-' '/' | sed -e "s/.x86_64$//x86_64/" gnupg2/2.0.14/6.el6_4/x86_64 gnutls/2.8.5/14.el6_5/x86_64 rpm -qa --queryformat="%{NAME}/%{VERSION}/%{RELEASE}/%{ARCH}\n" '^gnu*' gnupg2/2.0.14/6.el6_4/x86_64 gnutls/2.8.5/14.el6_5/x86_64
まずは rpm -qa の出力を ”−" => "/" に tr コマンドで 置換してみました。
でも それでは 最後の ".x86_64" の部分が "/x86_64" にはならなかったので、sed で置換しました。
雑談:
本来は 素の "rpm -qa" の出力を加工せずに済ます為に --queryformat が存在するのだと思います。
なぜ 素の "rpm -qa" の出力を加工する必要が発生したのでしょうか?
参考:
- RPMコマンドのqueryformatオプション http://akira-nishii.hatenablog.com/entry/2014/05/16/191701
投稿2014/11/08 19:06
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/11/09 05:17
2014/11/09 09:24
2014/11/09 13:35
2014/11/09 14:09
2014/11/09 14:12
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/11/09 13:29