FC2ブログ

子供の落書き帳 Remix

15/4/13:ひと月に一度更新するブログになってしまっている

スポンサーサイト
--/--/--(--) --:--:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

sedでスペースをタブに置換 (連続スペースは1文字とみなす)
2018/07/08(日) 12:57:29

きっかけ


Linuxのmpstatで取ったパフォーマンスの記録をExcelに貼り付ける必要があった。
Excelでは空白区切りを認識しないので、空白(半角スペース)をタブに変換したい。
このとき、連続する空白は1つのタブ記号に置換したい。
(連続しない1つだけ単独の空白も1つのタブ記号に置換したい。)

Linuxコマンドのsedを使ってやってみた。
(Excelの「テキスト ファイル ウィザード」を使えば可能ではあるが、GUIで大変なので)

環境 (sedのバージョン)


GNU sed、BSD sed、POSIXとかで微妙に挙動が違うらしい……

BSD sed などに代表される POSIX に準拠した sed は OS X などで標準で使用されているが、一般的な Linux で用いられる sed は後述する GNU sed であることが多い。ゆえに、Linux ユーザが OS X の sed を使用するとオプションなどのいわゆる「方言」的な違いに混乱することでしょう。
sed コマンドの用法 - Qiita


この記事では、以下の環境で確認した。

cygwin 64bit版

$ sed --version
sed (GNU sed) 4.2.2
Copyright (C) 2012 Free Software Foundation, Inc.
(後略)



「正規表現を有効にする」には?


正確には「拡張正規表現(extended regular expressions)を有効にする」らしい。
拡張正規表現なしでsedを使っても一部の正規表現は使えるが、普段の正規表現のやり方と微妙に違ったり、使えない演算子があったりして、かえってややこしい。
拡張正規表現を有効にしておいたほうが分かりやすい。

「-r -eを使おう」と書いてあるサイトと、
「-Eを使おう」と書いてあるサイトがある。

-eは「コマンドの指定をする」オプションであるため、
「-r -e コマンド」だと正しく動くが、「-e -r コマンド」だと-eとコマンドが離れているためエラーになる。
しか実のところ、-eは省略しても良いらしい。謎だ……。

置換の指定コマンド



以下のどれか1つ。
's/ +/\t/g'
's/\s+/\t/g'
's/ {1,}/\t/g'
's/\s{1,}/\t/g'


s : 置換
g : 行の全体で置換を実行 (つけないと行内で最初に出てきたスペースだけ置換される)

\s 空白とタブ両方に対応する
+ 1回以上の連続
{n,} で「n回以上の連続」を指定できる。

\sを使った方法は、入力にタブが無ければ期待通りに動く。

まとめ



最終的に、
「入力ファイルのスペースをタブに変換して出力する、ただし連続したスペースは1つのタブに変換する」
コマンドは、以下の通りである。

以下のどれか1つ。(ファイル名をinput.txt, output.txtとする)
sed -E 's/ +/\t/g' input.txt > output.txt
sed -E 's/\s+/\t/g' input.txt > output.txt
sed -E 's/ {1,}/\t/g' input.txt > output.txt
sed -E 's/\s{1,}/\t/g' input.txt > output.txt

「-E」の代わりに「-r -e」でもよい。「-r」でもよい。
  1. 2018/07/08(日) 12:57:29|
  2. プログラミング
  3. | トラックバック:0
  4. | コメント:0

コメント


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://luvtome.blog5.fc2.com/tb.php/647-02d35284
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。