助け合いフォーラム
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.
適切なコマンドを答えなさい。
$ 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.
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文字以上の文字列と解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。
正規表現を利用する主なコマンドには「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コマンドと同様)。
例)拡張正規表現「+」を使った抽出
なお、拡張正規表現の「?」「+」は、基本正規表現では「\?」「\+」で同様の指定ができます。
例)基本正規表現で「+」を扱う場合
置換コマンドオプションについて聞きたいです。
投稿日 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
コメント
この投稿に対して返信しませんか?