Regex」タグアーカイブ

sedの基本的な使い方

sedはstream editorの略で入力テキストをフィルタリング・テキスト変換するツールです。いろいろ複雑なこともできますが、ここではsedを使った簡単な文字列置換を紹介してみようと思います。

基本的な使い方

基本的な使い方は次のような感じです。

$ echo "input" | sed "s/pattern/replacement/"

"input"で入力した文字列のうちpatternに該当する部分がreplacementに置き換えられて表示されます。

テキストファイルの文字列を置換したい場合は次のような感じで使います。

$ sed "s/pattern/replacement/" input.txt

※結果を保存したい場合は> output.txtでリダイレクトしてください。

簡単な置換のサンプル

簡単な置換の例として、一番先頭にある小文字のtを大文字のTに置き換えてみます。

$ echo "stream editor for filtering and transforming text" | sed 's/t/T/'
sTream editor for filtering and transforming text

tは複数ありますが、何も指定しない場合は一番最初にマッチした部分のみが置き換えられます。今回の場合はstreamのtが該当します。

すべてのtを大文字に置き換えたい場合は"s/pattern/replacement/g"のようにgを追加してください。

$ echo "stream editor for filtering and transforming text" | sed 's/t/T/g'
sTream ediTor for filTering and Transforming TexT

正規表現を使った置換のサンプル

正規表現の詳細は省略しますがsedでも正規表現を使った置換ができます。

簡単な例として、スペース後のワードを-で分割して表示してみたいと思います。

$ echo "stream editor for filtering and transforming text" | sed -r "s/ (.)([^ ]*)/ \1-\2/g"
stream e-ditor f-or f-iltering a-nd t-ransforming t-ext

ポイントとしては\n (nは1から9の数字)を使って()でグループ化したn番目の文字列を参照できるという点です。

ちなみに、マッチした文字列全体を参照したい場合は&が使えます。

$ echo "stream editor for filtering and transforming text" | sed -r "s/ (.)([^ ]*)/ \1-&/g"
stream e- editor f- for f- filtering a- and t- transforming t- text

正規表現で文字列を分割したい場合はRegex.Split

C#で正規表現で文字列を分割したい場合はRegex.Splitが便利です。
使い方は次のような感じです。

数字で分割するサンプル

using System;
using System.Text.RegularExpressions;

public class Example1
{
  static public void Main ()
  {
    string pattern = "[0-9]+";
    string input = "abc123def456ghi";

    string[] result = Regex.Split(input, pattern);

    foreach(string s in result) Console.WriteLine(s);
  }
}

実行結果

abc
def
ghi

さらに、分割した文字列も表示したい場合は正規表現の( )を使います。

using System;
using System.Text.RegularExpressions;

public class Example2
{
  static public void Main ()
  {
    string pattern = "([0-9]+)";
    string input = "abc123def456ghi";

    string[] result = Regex.Split(input, pattern);

    foreach(string s in result) Console.WriteLine(s);
  }
}

実行結果

abc
123
def
456
ghi

正規表現が不要な場合はString.Splitも使えますので、いろいろ試してみてください。

リンク

Regex.Split Method (System.Text.RegularExpressions) | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.split?view=netframework-4.8

String.Split Method (System) | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.string.split?view=netframework-4.8