GISの属性テーブルはデータベースと理解していたので、中身の文字列を置換できるとは思っていませんでした。ので、チマチマ個別に入力したり、CSVで出力→Excelで編集→CSVを読み込み、みたいな面倒くさいことをしていました。今回、数千件の文字列の書式を変換する作業が発生したので、いろいろ調べてみたら、普通にできることが分かったので共有します。
参考1:https://qiita.com/kntoshiya/items/217cab81e4e6b37d8918
参考2:https://groups.google.com/g/qgisshitumon01/c/oWX9suovJM0?pli=1
サンプルデータは国土数値情報の公共施設@富山県。このポイントデータの属性テーブルのフィールドは、行政区域コードや分類、名称、所在地などからなっています。



↑に示したように、P02_005やP02_006には分類や名称が記述されています。ここではまず、P02_005の全角カッコを半角にしてみます。
まず、このファイルを編集可能にします。属性テーブルの鉛筆マークをクリックするか、レイヤを右クリックして編集モードを切り替えます。次に、フィールド計算機を開きます。


フィールド計算機を開いたら、「式」のスペースに以下のように入力します。
replace( "P02_005" ,'(','(')
replaceの書式はreplace(string, before, after)となっています。stringは文字列で、今回の場合はP02_005を指定しています。次に、beforeとして全角左カッコを、afterとして半角左カッコを指定しています。基本はこれだけで、あとは新たにフィールドを作るか、既存のフィールドを更新(上書き)するかを選びます。OKをクリックすると、全角左カッコが半角に変換されます。
なお、私の環境では式のフィールドで全角入力ができないので、テキストエディタなどに入力したものをコピペしています。全角での入力ができない場合は、コピペを試してみてください。


右カッコを全角にするには、もう一度replaceをかければ良いのですが、複数の置換を一度に行うことも可能です。例えば左右カッコを一度に半角にするには、次の式を入力します。
replace( replace("P02_005" ,'(','('),')',')')
つまり、replaceを重ねがけすれば良いということです。結果は↓の通りで、両カッコが半角になっています。また、隣りのP02_006には影響を与えていません。もちろん、replaceはいくつでも重ねられます。

もちろん、ある文字を削除することもできます。例えばカッコを削除したいと思ったら、
replace( replace("P02_005" ,'(',''),')','')
とすれば、↓のようにカッコが削除されます。

アンダーバーで繋いでみましょう。以下の式を入力します。
replace( replace("P02_005" ,'(','_'),')','')
結果は↓の通りです。

これで、文字列の細かい置換ができるようになりました。その他、役に立ちそうな式も紹介しておきます。
"P02_005" || '_' || "P02_009"
P02_005とP02_009をアンダーバーで繋ぎました。

定型文をくっつけることもできます。
concat( "P02_005" ,'_富山県')
とすれば、「富山県」という文字列が各セルの末尾につきます。ちなみに、これと一つ前の式でやっていることは同じなので、例えば
concat( "P02_005" , '_', "P02_009")
あるいは
"P02_005" || '_富山県'
と書くこともできます。定型文をくっつけるなんて、普通はやらないですよね。が、例えば、全てのセルの末尾に単位をつけるといった用途に使えます。フィールド計算機は奥が深いので、また何か見つけたら共有します。
最後に、文字列、とくに記号は色々なところに潜んでいるので、一括置換すると思わぬ結果を生む場合があります。置換対象のフィールドをよく見て式を適用してください。
























