bashにてファイル内のキーワードを参照し、文字列と共通する部分を抽出する方法


【内容】  
bashにて『キーワードが記載されたリスト（日本語、スペースあり、改行で区切り）』ファイルを参照し、与えた文字列（日本語、スペース・ハイフン等あり）とリストを比較して共通する部分を抽出し、与えた文字列の置換・変更に使いたいです。

【例】  
キーワードが記載されたリスト (hoge_list)

[code]

    東京都　中央区
    東京都　目黒区
    東京都　杉並区
    神奈川県　横浜市
    
[/code]

与える文字列 ($INPUT)

[code]

    "東京都　杉並区　阿佐ヶ谷　1-2-3"
    
[/code]

リスト内のキーワードと共通する部分が東京都 杉並区なので、その部分を抽出し

[code]

    阿佐ヶ谷　1-2-3
    
[/code]

を出力したいです。

よろしくお願いします。




hoge_list を辞書のように使って、なんとかして一致するものを探してそれを削除… ということをしようとすると、かなり厄介なので、もっと単純に、

  * 文字列の先頭が「東京都 中央区」だったらそれを削除
  * 文字列の先頭が「東京都 目黒区」だったらそれを削除
  * 文字列の先頭が「東京都 杉並区」だったらそれを削除
  * 文字列の先頭が「神奈川県 横浜市」だったらそれを削除

という処理にします。

「一致したら削除」には sed を使うと便利です。

[code]

    s|^東京都　中央区||
    s|^東京都　目黒区||
    s|^東京都　杉並区||
    s|^神奈川県　横浜市||
    
[/code]

という内容のファイルを hoge_list.sed という名前で作成しておき、

[code]

    echo '東京都　杉並区　阿佐ヶ谷　1-2-3' | sed -f hoge_list.sed
    
[/code]

と実行すると、

[code]

    　阿佐ヶ谷　1-2-3
    
[/code]

が得られます。

hoge_list は実際にはかなりの行数があるでしょうから、それを元に hoge_list.sed を作るのも自動化したいですよね。  
その部分も含めてシェルスクリプトにまとめると、以下のようになります。

[code]

    #!/bin/bash
    
    cat hoge_list | sed -e 's/\(.*\)/s|^\1||/' > hoge_list.sed
    
    sed -f hoge_list.sed | sed -e 's/^　//'
    
[/code]

このスクリプトを test.sh という名前で保存し、実行すると、

[code]

    $ echo '東京都　杉並区　阿佐ヶ谷　1-2-3' | ./test.sh
    阿佐ヶ谷　1-2-3
    $ 
    
[/code]

という出力が得られます。

