レス
元トピ次レス
タイトル
Re: 問題10865 について
フォーラム
LinuC/LPIC全般
投稿ユーザ(投稿日)
(2013/6/11)
本文
どう思いますか?もいいのですが、検証はしてみましたか?
私のところでの検証結果は解説にある通りの結果となりました。

おそらく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に」されては困ります。
実際に実行すると
[code]
$ sed s/ab/AB/g test.txt
a b AB
a b AB
a b AB
[/code]
となります。

なので、sコマンドを使うパターンとして

-----引用(始)-----

sed -e s/a/A/g -e s/b/B/g test.txt

-----引用(終)-----

が正解として挙がっているのです。

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

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

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

レス一覧

元トピ次レス


Ping-tモバイルTOP

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