こんにちは、minoruです。
Ubuntuでテキストファイル内の余分な飾り文字として68個並んだハイフン「-」を削除したいなぁと思って作業した時の事。
私がハイフンを置換・削除しようとしていたテキストファイルは以下のような感じ。
--------------------------------------------------------------------
1-1 1up mushroom is there.
1-2 1up mushroom is there.
1-3 1up mushroom is none.
1-4 1up mushroom is none.
そう、2行目の68個並んだハイフンがいらないのです。
連続したハイフンだけを置換削除する方法
結論から言うと以下の通りです。
ハイフンにはエスケープ文字は不要。2つ以上ハイフンが続く場合を示す{2,}の{}がエスケープが必要って事ですね。ちなみに3つから6まで…などとしたい場合は \{3,6\} こんな感じで表現すればOKです。
今回の場合は飾り区切りとして使われているハイフンは68個並んでいますから、 \{68\} と書いてもOKですし、偶数なので実は
これでもOKなんだけど、いつも偶数とは限らないので今後のメモとして。
置換条件を囲っているシングルクォーテーションはダブルクォーテーションでも大丈夫なんですが、ダブルクォーテーションで囲った場合は「$」「`」「\」などがあると挙動が変わってしまいます。
例えばシェルスクリプトを使って置換の際に変数を使おうとする場合はダブルクォーテーションで囲まないとダメです。シングルクォーテーションでは変数の中身では無く、変数そのままの見た目上の文字として扱います。
なので普通にテキストの置換ならシングルクォーテーションが良いのでは無いかと思います。
ちなみに「s/」は正規表現で置換を行う事を表していて、sのあとは#などでも構わないようです。置換する文の中に「/」自身が含まれているような場合には「#」などを使えば良いみたいですね。「sの後に使った記号が区切り文字」として機能するようです。
そして「//g」ですが、//の間に何も入れなければ削除、たとえば「/hoge/g」と入れていれば条件に一致した文を「hoge」に置換します。最後の「g」を省略すると1行の中に複数回一致があっても最初の1回しか置換しませんので、通常は付けておいた方が良いですね。
trコマンドに関する覚書
trは1文字だけ置換するコマンド。
ちなみに tr でも、ファイル内に半角スペースが1個だったり、2個連続だったり、5個連続だったりと無数にある場合、それを「n個の連続したスペースを1個のタブ文字に置換する」というテクニックがあります。
まず、何個連続しているかわからないが、ファイル内の全ての「スペースの連続」を1つのスペースに置換します。やり方は以下の通り。
trの後に付け加えている「-s」というオプションが、同じ連続した文字を1文字に置き換えるという意味です。
これで連続したスペースが全て「1個のスペース」に置換されますので、例えばそのスペースをタブ文字に変換したいなーという時は、そのあとスペースをタブ文字に置換します。
このように2段階に分けてやります。
sedなら\+を付ける
同等の事をsedでやるなら…
\+というのが「スペースが1個以上並んでいたらそれを1つの塊として扱え」という意味なんですけど、この+の前に\を付け忘れないように注意。