:バージョンを保存し、ビルド番号、入力の最後にそれらを印刷。
sedには、現在の行の値で始まるパターンスペースと、処理中の値を保存するための保存スペースがあります。バージョンは、ホールドスペースの値の前に追加する必要があります。これは、ホールドスペースをG
というパターンスペースに追加することで実現できます。ビルドは、H
で実行できるホールドスペースに追加する必要があります。 H
が作成する改行を削除するには、保留スペースをパターンスペースに戻します。どちらの場合も、G
とH
で作成された改行はs///
で削除され、次にh
で保留スペースに戻ります。入力の最後は$
アドレスで表され、保持スペースがパターンスペースに戻されて印刷されます。表示するのが短くなります:
sed -n -e '/^version.*=/ {s/[^=]*=//; G; s/\n//; h; } ' \
-e '/^build.*=/ { s/[^=]*=//; H; g; s/\n/./; h; } ' \
-e '$ { g; P; }'
これは文字列の最後に改行を生成しますが、うまくいけば問題はありません。
ユーティリティのawkファミリは変数をサポートしているため、タスクがより簡単になります。それらには特殊な変数OFS、出力フィールドセパレータ、出力レコードセパレータORSがあります。 awkのprint
は、各引数の間にOFSを出力し、最後にORSを出力します。特別なパターンEND
は、入力の終了後に一致します。
awk -v OFS=. -v ORS='' \
'/^version.*=/ {sub(/^[^=]*=/, ""); version=$0;} \
/^build.*=/ {sub(/^[^=]*=/, ""); build=$0;} \
END {print version, build;}'
あなたが最後のドットを気にしないと、バージョンの順序の特定することができ、メイクファイル内の行を構築する場合:
awk -v ORS=. '/(version|build).*=/ { sub(/^[^=]*=/, ""); print; } '
の言語の表現に上向き継続はperlのです。 perlのEND
にはawkと同様の機能があり、プロセスの最後に実行されるブロックをマークします。ハッシュを使用して完全なバージョン番号の部分を保存し、行を一致させてバージョンとビルドを保存して1行にまとめることができます。
perl -n -e '$ver{$1} = $2 if /^(version|build)[^=]*=(.*)/; \
END {$,="."; print @ver{"version","build"}};'
興味深い練習のためにsedを使用していますが、エクササイズの価値は自分自身を強化することです。他の人に向ける必要がある場合は、solve the problemにどのように挑戦しているかに集中するのではなく、推奨される方法を見つけ出す方がよいでしょう。あなたはもっと学ぶでしょう。
「 – Kent
@Kentのみのsedを使って」言及OP:AWK何、みじん切り肝臓時には質問者はそれが教育目的のためだとしても、を求めたものよりももっと良いものがあるのを誰かがを求めた場合は?。ソケットレンチが手に近づいたときに六角ボルトを取り外すためにバイスグリップを使用すると、ソケットレンチを手に渡すことができますが、それはできません、それほど良いものではありません。文字列とそれを最後にのみ出力しますが、awkは一致する行ごとに出力します。出力文字列が短いため、例との違いはほとんどありませんが、常にそうであるとは限りません。 – outis
if Iこの問題があった、私の最初の試みはawkすぎるだろう。ほとんどのケースでは、awkはsedよりはるかに柔軟です。 (個人的な意見)。 OPは答えの範囲を狭める。あなたからのawkソリューションのために、btw。私はテストしなかった。私は最後に余分なドット( "。")があるだろうと思う。一致したすべての行について\\ 1と "。"を出力するからです。最後に。 ORSと\\ 1 "ドットを繰り返すことがあります。 – Kent