助け合いフォーラム

LinuC

LinuC Lv1-101(Ver10.0)
問題ID : 14864
問題を開く
以下の「test.txt」ファイルにある「ping-t」を「HOGE」に変換して出力したい。
適切なコマンドを答えなさい。

$ cat test.txt
ping-t is synthesis WEB study site.  
PING-T keeps always assisting in you.

正解

sed -e 's/p....t/HOGE/g' test.txt

解説

ファイルや標準入力の内容を編集して表示するにはsedコマンドを利用します。

sedコマンドの書式と主なオプション・編集コマンドは以下のとおりです。

sed [オプション] 編集コマンド [ファイル名]
sed [オプション] -e 編集コマンド1 [-e 編集コマンド2 ...] [ファイル名]
sed [オプション] -f スクリプト [ファイル名]


上表より、文字列を置換する編集コマンドは「s/文字列1/文字列2/g」です。
選択肢の中で文字列1にあたる「ping-t」にマッチするのは、「p」と「t」の間に任意の4文字を表している「p....t」です。

したがって正解は
・sed -e 's/p....t/HOGE/g' test.txt
です。

以下は実行例です。

$ cat test.txt
ping-t is synthesis WEB study site.  
PING-T keeps always assisting in you.
$
$ sed -e 's/p....t/HOGE/g' test.txt
HOGE is synthesis WEB study site.  
PING-T keeps always assisting in you.

その他の選択肢については以下のとおりです。
・sed -e 's/ping/HOGE/g' test.txt
pingをHOGEに変換しますので、誤りです。
【実行結果】
HOGE-t is synthesis WEB study site.  
PING-T keeps always assisting in you.

・sed -e 's/p*t/HOGE/g' test.txt
pが0文字以上続いてtで終わる文字列(t,pt,ppt,ppptなど)をHOGEに変換しますので、誤りです。
【実行結果】
ping-HOGE is synHOGEhesis WEB sHOGEudy siHOGEe.  
PING-T keeps always assisHOGEing in you.

・sed -e 's/p.*t/HOGE/g' test.txt
pではじまり任意の文字列を挟み、tで終わる文字列をHOGEに変換しますので、誤りです。
【実行結果】
HOGEe.  
PING-T keeHOGEing in you.

なお、「p.*t」のパターンに合致するのは、一行目の「ping-t」ではなく、先頭の「p」から「site」の「t」までです。
正規表現には、最も左から、最も長く一致するものにマッチするという法則があります。

・sed -e 's/[ping-t]/HOGE/g' test.txt
p,i,nおよび、gからtのいずれかの文字をHOGEに変換しますので、誤りです。
【実行結果】
HOGEHOGEHOGEHOGE-HOGE HOGEHOGE HOGEyHOGEHOGEHOGEeHOGEHOGEHOGE WEB HOGEHOGEudy HOGEHOGEHOGEe.  
PING-T HOGEeeHOGEHOGE aHOGEwayHOGE aHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGE HOGEHOGE yHOGEu.

参考

正規表現とは、文字列の特定のパターンを認識する為に使用する表現方法です。文字列の検索や置換などを行う際に利用します。正規表現には基本正規表現(BRE: Basic Regular Expression)と拡張正規表現(ERE: Extended Regular Expression)があります。

以下は主な正規表現とその使用例をまとめたものです。


なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意してください。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。

正規表現を利用する主なコマンドは以下のとおりです。

・grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
なお、「-E」オプションを併用すると拡張正規表現が使えます(egrepコマンドと同様)。

・sed
ファイルや標準入力の内容を編集して表示するコマンド

例1)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合

$ grep '[1-5]' test.txt

例2)「test.txt」ファイルの「#」から始まる行を削除して出力する場合

$ sed '/^#/d' test.txt

基本正規表現と拡張正規表現の違いに注意してください。grepコマンドは、-Eオプションを付けないと検索パターンを基本正規表現と判断しますので、上表の拡張正規表現が使えません。

実行例)


基本正規表現では「?, +」は「\?, \+」とすることで、拡張正規表現と同様の意味を持つようになります。

上に戻る

置換コマンドオプションについて聞きたいです。

公開日 2024/01/04

解説で編集コマンドにs/文字列1/&を含む文字列という記載があるのですが、
使用例を教えて頂きたいです。お願いします。

2024/01/05 10:20

使用例というのはこういうことですか?

$ cat todofuken.txt | sed -e 's/Tokyo/& to/' | sed -e 's/(Kyoto|Osaka)/& Fu/'
Hokkaido
Akita
Aomori
Tokyo to
Aichi
Kyoto
Osaka
Okayama
Fukuoka
Kagoshima

他にもググったらちょこちょこ出てくる(とはいえ & を無効化する話が多く見られますが)ので、そういうのも参考にされると良いかと思います。
https://zenn.dev/peg/articles/72bde0980dde20


コメント

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?