【PowerShell】xliffをファイル横断検索(grep)

TradosやMemsourceといった翻訳支援ツール(CATツール)では、バイリンガル文書xliff(mxliff)というフォーマットが使用されます。

たくさんファイルがたまってくると、一括検索をしたくなることってありませんか?

もちろん、同じファイル内やプロジェクト内であれば「検索と置換」ができますが、
リンギストとしてアサインされた場合や、別の似たプロジェクト、過去案件から探したい場合などはなかなか大変です。

これをWindowsの標準機能で解決してしまいましょう。

そう、PowerShellの出番です。

xliffファイルについて

xliffファイルは原文、訳文が対訳形式で保存されているxmlファイルの一種です。
ほかにも言語情報や使用ソフト、更新日時なども保存されたりしていますが、
要はテキストエディタでも開くことのできる、プレーンなフォーマットです。

こうしたファイルから一括検索(grep)するには、Select-String を使うのがよいでしょう。

Select-Stringを使う

まずは検索対象にしたいxliffファイルを特定のフォルダにコピーします。

次に、このフォルダでPowerShellを開きます。
※特定フォルダでのPowerShellの開き方は【PowerShell】使うための準備~Get-ChildItemでファイルリストを作成 を参照してください。

あとはコマンドレット Select-String を使えばOKです。

Select-String の使い方は次の通りです。

Select-String -Path 検索対象 -Pattern 検索文字列

検索対象はワイルドカードが使えます。
上ではxliffとmxliffを対象にするために、*.?xliff としていますが、
フォルダ内に検索対象ファイルしかないのであれば *.* でも問題ありません。

次に検索文字列です。
ここに入力した文字列を含む行が表示されます。

xliffは通常、原文と訳文が別の行に保存されているので、このような検索が可能です。

中国語を検索

さて、これだけで解決!と言いたいところですが、まだもう一つ問題が残っています。

そう、多言語の問題です。

この時代にあってPowerShellは(VBAも)多言語に対応しておらず、中国語が入力できません。

PowerShellの表示を変更するchcpを試してみたのですが、

  • UTF-8(65001)
  • GB2312(936)
  • GB18030(54936)
  • Big5(950)

など、どれもうまくいきません。

検索結果は中国語でも表示されるのに……

というわけで仕方がありません。別のテキストファイル(list.txt)に一旦保存して、Get-Content で読み込むことにします。

$search = Get-Content list.txt -Encoding "UTF8"
Select-String -Path *.* -Pattern $search

ちょっと面倒ですが、これで無事解決できました。

おそらくですが、この方法であれば、どんな言語でも実行できるはず。

Select-Stringチートシート こだわり検索

Select-String には-Pathと-Pattern以外にも使用できるオプションがあります。

これを使うことで、より細かな検索が可能です。

エイリアス

  • sls

オプション

オプション引数説明
*-path1つまたは複数の文字列対象となるファイルパスです。
フォルダ内の全てのファイルが対象の場合、*.*でOkです。
*-patten1つまたは複数の文字列または正規表現検索したい文字列です。
カンマで区切って複数の指定も可能です。
-NotMatchなしパターンに「一致しない」行のみを取り出すようになります。
-CaseSensitiveなしアルファベットの大文字・小文字を区別するようになります。
*はこの順で入力する場合に、オプションの指定がいらないものを示す

【課題】お手軽コマンドに……

次回はここで紹介した、読み込み~検索までの効率化のため、処理のパッケージ化をしたいと思います。

具体的にはテキストファイルに羅列された文字列を順に検索し、
結果を別ファイルに保存しておけるようにするつもりです。こうご期待!

CATOVIS LS

MS Office Wordと接続。軽量型でWYSIWYGを実現