Re: 問題10865 について

この質問の投稿一覧へ

なし Re: 問題10865 について

msg# 1.1
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2013-6-12 9:49 | 最終変更
arashi1977  長老 居住地: 広島  投稿数: 1715
どう思いますか?もいいのですが、検証はしてみましたか?
私のところでの検証結果は解説にある通りの結果となりました。

おそらくsedのyとsコマンドの違いをきちんと理解されていないのではないかと思います。

sedのMan page(http://linuxjm.sourceforge.jp/html/GNU_sed/man1/sed.1.html)を見ると
引用:
s/regexp/replacement/
パターンスペースに対して regexp のマッチを試みる。マッチに成功すると、マッチした部分を replacement に置換する。replacement には特殊文字である & を含めることができ、これはパターンスペースのマッチした部分を参照する。また \1 から \9 までの特殊エスケープを含むこともでき、これは regexp の部分正規表現 (sub-expression) にマッチした部分をそれぞれ参照する。
引用:
y/source/dest/
パターンスペースにある文字のうち、source にあるものを、dest の同じ位置にある文字に置換する。
とあり、パターンスペース(処理対象行)に対してどのように処理するかが異なります。

簡単に言うと
s:正規表現パターン「通りの文字列」を置き換えパターンに置換
y:前の「組」の該当する文字を、後ろの「組」の同じ位置の文字列に置換
ということです。

sコマンドの最後にg(global)がついていると、「パターンスペース内のすべてのregexp(正規表現)マッチングを行い、ヒットしたらreplacement(置き換え文字列)に置換する」となります。
正解だとおっしゃっている、「sed s/ab/AB/g test.txt」を解釈すると
「sedコマンドよ、"ab"という文字列を見つけたら"AB"に変換せよ。各行1回でやめるのではなく、行の最後まで何度でも実行せよ」
となります。
設問では「aをAに、bをBに」とあるので、「abをABに」されては困ります。
実際に実行すると
$ sed s/ab/AB/g test.txt
a b AB
a b AB
a b AB
となります。

なので、sコマンドを使うパターンとして
引用:
sed -e s/a/A/g -e s/b/B/g test.txt
が正解として挙がっているのです。

yコマンドについてですが、実例を以下に記載します。どういう動きかがわかりやすいかもしれません。
$ cat test.txt
arashi1977

$ sed y/abcde12345/fghij67890/ test.txt
frfshi6977

$ sed y/abcde12345/67890fghij/ test.txt
6r6shif977

投稿ツリー

  >フォーラム検索へ


Copyright (c) 2020 Ping-t All rights reserved.