問題10865 について

  • フォーラムは新サイトへ移行しました。
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 .3 | 投稿日時 2013-6-11 17:23
nvoia  常連   投稿数: 11
「test.txt」ファイル内の全ての「a」を「A」に、また「b」を「B」に置換したい。適切なコマンドは次のうちどれか。(全て選択)

上記の回答として、・sed y/ab/AB/ test.txtと記載されているですが、正解ではないと思います。理由はファイル内のすべてという条件を満たしていないからです。皆様どう思いますか?

また、・sed s/ab/AB/g test.txtが選択肢あるのですが、回答には
”文字列「ab」を「AB」に置換しますので、誤りです。”と記載されております。こちらが正解だと思うのですが、皆様どのように思いますか?
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 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
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2013-6-12 15:45
nvoia  常連   投稿数: 11
arashi1977様

迅速な対応ありがとうございます。とても嬉しく思います。arashi1977様の説明は初心者の私としては、難しいものがあります。検証環境がない中、お願いするのは、誠に恐縮なのですが。

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

それぞれの例を示して頂ければ幸いです。宜しくお願い致します。
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2013-6-12 15:59
nvoia  常連   投稿数: 11
arashi1977様

sed s/ab/AB/g test.txtが何故正解ではないのか理解できました。

a b ab
a b ab
a b ab
から
a b AB
a b AB
a b AB
と置換されます。
A B AB
A B AB
A B AB
のように置換されません。
自分のケアレスミスでした。

誠実な対応、誠にありがとうございました。

  >フォーラム検索へ


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