怪しげなIPアドレス・ドメイン・ファイル名などを資料に転記するとき、リンクとして機能しないよう、念のためドットを括弧でくくっている(慣例的に)。ドットを全部、“[.]”に置換すれば手間はないのだけど、見た目がごちゃごちゃするので、最後のドットだけを括弧でくくりたい(慣例的に)。
cat list.txt
192.0.2.0/24
www.example.com
infected.exe
これを、下のようにしたい。
192.0.2[.]0/24
www.example[.]com
infected[.]exe
結論としては、
sed
cat list.txt | sed -e "s/\.\([^.]*\)$/[.]\1/"
…だったのだけど、包括指定子とか後方参照子とか何?正規表現ワカリマセン。って感じだったで以下メモ。
- 置換対象の文字列は、
\. ドットで始まって、
[^.]* 「ドット以外の文字列」が後ろにあって、
$ しかるのち行末がくる
- で、↑こうやって指定する中で、
(包括指定子っていうのを入れてやる)
\(...\) 「ドット以外の文字列」を、再利用できる【カタマリ】にしておく。
(上の例でいうと、それぞれ“0”、“com”、“exe”を取り出したイメージ)
これで「sed/A/B/」のA部分が指定できた。
- 一方、「sed/A/B/」のB部分(置換後の文字列)は
/[.] “.”を、“[.]”に置換する
と指定したいのだけれども、そのまま実行すると、
cat list.txt | sed -e 's/\.\([^.]*\)$/[.]/g'
192.0.2[.]
www.example[.]
infected[.]
と、素直に「最後のドット以降」をまるっと“[.]”にしてしまう。
そこで、
(後方参照子っていうんだって)
\1 先ほどの【カタマリ】を参照させる
ってやつを、“[.]”のお尻にくっつける。
/[.]\1 “[.]”に置換して後ろに【カタマリ】がくるようにする
- 実行してみる。
結論
cat list.txt | sed -e 's/\.\([^.]*\)$/[.]\1/g'
192.0.2[.]0/24
www.example[.]com
infected[.]exe
…できた。
- ちなみに以下は失敗例。
sed -e 's/\.\([^.]*\)$/\1[.]/g'
→ www.examplecom[.]
「最後のドット以降(.com)」を【カタマリ(com)】に置換して、後ろに“[.]”をくっつける
sed -e 's/\(\.[^.]*\)$/[.]\1/g'
→ www.example[.].com
「最後のドット以降(.com)」を【カタマリ(.com)】に指定しているので、ドットが1つ余る
参考にしました)
正規表現 & sed & awk