LoginSignup
2
6

More than 5 years have passed since last update.

sedで行(文字列)の最後のドットだけ括弧でくくりたい

Last updated at Posted at 2017-09-28

 怪しげな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

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6