助け合いフォーラム
LinuC Lv1-101(Ver10.0)
問題ID : 35515
問題を開く
以下の内容のテキストファイルFileがある。
cat File | sed s/r/O/i を実行した結果はどれか。
cat File | sed s/r/O/i を実行した結果はどれか。
正解
解説
ファイルや標準入力の内容を編集して表示するにはsedコマンドを利用します。
「sed s/文字列1/文字列2/i」のコマンドは、各行の最初に現れる文字列1について、大文字と小文字を区別せずにマッチし、文字列2に置換します。
1行目
X … r または R でないため、マッチしません
r … この行の最初の r または R ですのでマッチし、Oに置換されます
r … この行の最初のマッチより後にあるので、 マッチしません
2行目
R … この行の最初の r または R ですのでマッチし、Oに置換されます
r … この行の最初のマッチより後にあるので、 マッチしません
r … この行の最初のマッチより後にあるので、 マッチしません
したがって、正解は
です。
sedコマンドの書式と主なオプション・編集コマンドは以下のとおりです。
sed [オプション] 編集コマンド [ファイル名]
sed [オプション] -e 編集コマンド1 [-e 編集コマンド2 ...] [ファイル名]
sed [オプション] -f スクリプト [ファイル名]
その他の選択肢は全て、置換対象が間違っています。
なお、i を指定しないデフォルトの場合(sed s/r/O/)の結果は、以下の選択肢と同じになります。
「sed s/文字列1/文字列2/i」のコマンドは、各行の最初に現れる文字列1について、大文字と小文字を区別せずにマッチし、文字列2に置換します。
1行目
X … r または R でないため、マッチしません
r … この行の最初の r または R ですのでマッチし、Oに置換されます
r … この行の最初のマッチより後にあるので、 マッチしません
2行目
R … この行の最初の r または R ですのでマッチし、Oに置換されます
r … この行の最初のマッチより後にあるので、 マッチしません
r … この行の最初のマッチより後にあるので、 マッチしません
したがって、正解は
です。
sedコマンドの書式と主なオプション・編集コマンドは以下のとおりです。
sed [オプション] 編集コマンド [ファイル名]
sed [オプション] -e 編集コマンド1 [-e 編集コマンド2 ...] [ファイル名]
sed [オプション] -f スクリプト [ファイル名]
その他の選択肢は全て、置換対象が間違っています。
なお、i を指定しないデフォルトの場合(sed s/r/O/)の結果は、以下の選択肢と同じになります。
参考
【正規表現】
正規表現とは、文字列の特定のパターンを認識する為に使用する表現方法です。文字列の検索や置換などを行う際に利用します。正規表現には基本正規表現(BRE: Basic Regular Expression)と拡張正規表現(ERE: Extended Regular Expression)があります。
以下は主な正規表現とその使用例をまとめたものです。
なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意してください。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。
正規表現を利用する主なコマンドには「sed」「grep」があります。
■sed
ファイルや標準入力の内容を編集して表示するコマンド
例1)「test.txt」ファイルの「#」から始まる行を削除して出力する場合
$ sed '/^#/d' test.txt
例2)「test.txt」ファイルの空行を削除して出力する場合
$ sed '/^$/d' test.txt
※正規表現では「^」は行頭、「$」は行末の意味であるため、「^」と「$」の間に文字を挟まずつなげることで、文字が存在しない行(空行)を表します。
■grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
例)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合
$ grep '[1-5]' test.txt
[基本正規表現と拡張正規表現]
基本正規表現と拡張正規表現の違いに注意してください。
grepコマンドは、-Eオプションを付けない場合は検索パターンを基本正規表現と判断します。
grepコマンドの検索パターンで拡張正規表現を使うには、-Eオプションを指定します(egrepコマンドと同様)。
例)拡張正規表現「+」を使った抽出
なお、拡張正規表現の「?」「+」は、基本正規表現では「\?」「\+」で同様の指定ができます。
例)基本正規表現で「+」を扱う場合
正規表現とは、文字列の特定のパターンを認識する為に使用する表現方法です。文字列の検索や置換などを行う際に利用します。正規表現には基本正規表現(BRE: Basic Regular Expression)と拡張正規表現(ERE: Extended Regular Expression)があります。
以下は主な正規表現とその使用例をまとめたものです。
なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意してください。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。
正規表現を利用する主なコマンドには「sed」「grep」があります。
■sed
ファイルや標準入力の内容を編集して表示するコマンド
例1)「test.txt」ファイルの「#」から始まる行を削除して出力する場合
$ sed '/^#/d' test.txt
例2)「test.txt」ファイルの空行を削除して出力する場合
$ sed '/^$/d' test.txt
※正規表現では「^」は行頭、「$」は行末の意味であるため、「^」と「$」の間に文字を挟まずつなげることで、文字が存在しない行(空行)を表します。
■grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
例)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合
$ grep '[1-5]' test.txt
[基本正規表現と拡張正規表現]
基本正規表現と拡張正規表現の違いに注意してください。
grepコマンドは、-Eオプションを付けない場合は検索パターンを基本正規表現と判断します。
grepコマンドの検索パターンで拡張正規表現を使うには、-Eオプションを指定します(egrepコマンドと同様)。
例)拡張正規表現「+」を使った抽出
なお、拡張正規表現の「?」「+」は、基本正規表現では「\?」「\+」で同様の指定ができます。
例)基本正規表現で「+」を扱う場合
sedコマンドの変換について
投稿日 2024/11/25
問題の答えを
X00
000
と間違えたのですが、なぜ正解のようになるのでしょうか。また、試しに
sed s/rr/0O/i
X00
00r
から元に戻すために
sed s/r/O/i
と打ち込んだところ
Xrr
Rrr
と元に戻りました。
なぜrr→00に変換するには「s/rr/0O/i」とrと0が余分に必要なのに、もとに戻すときは「s/r/O/i」で済むのでしょうか。また、特に大文字の指定をしてないのに大文字に戻っているのでしょうか。画像が貼れず手打ちになってしまい、わかりにくいかもしれませんがどなたか教えてくださるとありがたいです。
2024/11/26 09:23
手元の環境でやってみてもおっしゃるように元に戻らないのですが、実行したコマンドを省略せず記載していただくことは可能でしょうか?
$ echo X00 | sed "s/r/0/i"
X00
$ echo X00 | sed "s/0/r/i"
Xr0
$ echo X00 | sed "s/0/r/"
Xr0
$ echo 00r | sed "s/0/r/i"
r0r
$ echo 00r | sed "s/r/0/i"
000
コメント
2024/11/26 13:52
$ vi file
Xrr
Rrr
$ sed s/r/0/i file
X0r
0rr
$ sed s/0/r/i file
Xrr
Rrr
sed s/rr/00/i file
X00
00r
$ sed s/0/r/i file
Xrr
Rrr
となりました。
回答者様の返答を見て「echo」ではなく「vi」で入力したからなのかな、と考えが浮かびました。
また、なぜ問いの答えが正解の形になるかについては、/gで指定していなかったからだと自己解決できました。
省略せず打ち込んでみましたがいかがでしょうか。
コメント
この投稿に対して返信しませんか?
P Pnt785_428
2024/11/26 13:56
すいません、なぜか間の文字が大きくなってしまいましたが特に意味はないので気しないでいただけると助かります。