はじめに
コピーしたテキストをそのままペーストしていませんか?
PowerShell を使えば、貼り付ける前に加工するという使い方ができます。
本記事では、Get-Clipboard と Set-Clipboard を起点に、
文字列変換・行操作・抽出などをパイプラインで組み合わせる
実用的なテキスト加工例を紹介します。
コピペ作業を少しでも減らしたい方や、
PowerShell のパイプライン処理に慣れたい方の参考になれば幸いです。
動作環境
- Windows: PowerShell 5.1以降(Windows 10/11に標準搭載)
基本パターン:取得→加工→セット
# 基本形
Get-Clipboard | <加工処理> | Set-Clipboard
# 例:大文字変換
Get-Clipboard | ForEach-Object { $_.ToUpper() } | Set-Clipboard
# 例:トリム(前後の空白削除)
Get-Clipboard | ForEach-Object { $_.Trim() } | Set-Clipboard
Get-Clipboard の動作モード
| オプション | 戻り値 | 用途 |
|---|---|---|
| (なし) | 行ごとの配列 | 行単位の加工・フィルタ |
-Raw |
単一の文字列 | 正規表現抽出・JSON整形など全文処理 |
本記事では、行単位処理がほとんどですが、データ抽出やJSON整形など一部のセクションでは -Raw を使用します。
文字列変換
※ 行単位処理
# 大文字・小文字
Get-Clipboard | ForEach-Object { $_.ToUpper() } | Set-Clipboard # HELLO
Get-Clipboard | ForEach-Object { $_.ToLower() } | Set-Clipboard # hello
# キャメルケース → スネークケース
Get-Clipboard | ForEach-Object {
($_ -creplace '([A-Z])', '_$1').ToLower().TrimStart('_')
} | Set-Clipboard
# userName → user_name
# ※ 略語を含む場合(例: URLValue → u_r_l_value)は期待とズレることがあります
# スネークケース → パスカルケース
Get-Clipboard | ForEach-Object {
($_ -split '_' | Where-Object { $_.Length -gt 0 } | ForEach-Object {
$_.Substring(0,1).ToUpper() + $(if ($_.Length -gt 1) { $_.Substring(1) } else { '' })
}) -join ''
} | Set-Clipboard
# user_name → UserName
# _test → Test、test__name → TestName も正しく処理
# ※ 先頭を小文字にしたい場合(camelCase)は、結果に対して追加処理が必要です
行操作
※ 行単位処理
# 空行削除(空白のみの行も削除)
Get-Clipboard | Where-Object { $_.Trim() -ne "" } | Set-Clipboard
# 重複行削除
Get-Clipboard | Select-Object -Unique | Set-Clipboard
# ソート
Get-Clipboard | Sort-Object | Set-Clipboard
# 降順ソート
Get-Clipboard | Sort-Object -Descending | Set-Clipboard
# 行番号付与
$i = 1
Get-Clipboard | ForEach-Object { "{0:D3}. {1}" -f $i++, $_ } | Set-Clipboard
# 先頭N行だけ
Get-Clipboard | Select-Object -First 10 | Set-Clipboard
# 末尾N行だけ
Get-Clipboard | Select-Object -Last 5 | Set-Clipboard
# 特定行をスキップ
Get-Clipboard | Select-Object -Skip 2 | Set-Clipboard
検索・フィルタ
※ 行単位処理
# 特定パターンを含む行だけ
Get-Clipboard | Where-Object { $_ -match "error" } | Set-Clipboard
# 特定パターンを含まない行
Get-Clipboard | Where-Object { $_ -notmatch "debug" } | Set-Clipboard
# 空白行以外(完全な空行のみ削除、スペースやタブだけの行は残る)
Get-Clipboard | Where-Object { $_ -match '\S' } | Set-Clipboard
# ※ 空白のみの行も削除したい場合は「行操作」セクションの空行削除を使用
# 数字を含む行
Get-Clipboard | Where-Object { $_ -match '\d' } | Set-Clipboard
置換・削除
※ 行単位処理
# 単純置換
Get-Clipboard | ForEach-Object { $_ -replace "old", "new" } | Set-Clipboard
# 複数パターン置換
Get-Clipboard | ForEach-Object {
$_ -replace "foo", "bar" -replace "baz", "qux"
} | Set-Clipboard
# タブをスペースに
Get-Clipboard | ForEach-Object { $_ -replace "`t", " " } | Set-Clipboard
# 連続スペースを1つに
Get-Clipboard | ForEach-Object { $_ -replace '\s+', ' ' } | Set-Clipboard
# コメント行削除(行頭が # で始まる行を削除)
Get-Clipboard | Where-Object { $_ -notmatch '^\s*#' } | Set-Clipboard
# ※ 行末コメント(例: コード # コメント)は削除されません
# HTMLタグ削除
Get-Clipboard | ForEach-Object { $_ -replace '<[^>]+>', '' } | Set-Clipboard
フォーマット変換
※ 行単位処理(一部 -Raw 使用)
# CSV → タブ区切り
Get-Clipboard | ForEach-Object { $_ -replace ',', "`t" } | Set-Clipboard
# ※ 単純なCSV向け。クォートやカンマを含むフィールドがあると正しく変換されません
# タブ区切り → CSV
Get-Clipboard | ForEach-Object { $_ -replace "`t", ',' } | Set-Clipboard
# ※ 単純なデータ向け。フィールド内にカンマがあると壊れます
# 各行をクォートで囲む
Get-Clipboard | ForEach-Object { "`"$_`"" } | Set-Clipboard
# リストをカンマ区切りに
(Get-Clipboard) -join ", " | Set-Clipboard
# カンマ区切りをリストに(-Raw使用)
(Get-Clipboard -Raw) -split ",\s*" | Set-Clipboard
# JSON整形(-Raw使用)
Get-Clipboard -Raw | ConvertFrom-Json | ConvertTo-Json -Depth 10 | Set-Clipboard
# ※ クリップボードの内容が不正なJSONの場合はエラーになります
プログラミング支援
※ 行単位処理
# 変数宣言生成(各行を変数に)
Get-Clipboard | ForEach-Object {
"`$" + ($_ -replace '\s+', '_') + " = `"`""
} | Set-Clipboard
# SQL IN句生成
$items = (Get-Clipboard) -replace "'", "''"
"('" + ($items -join "', '") + "')" | Set-Clipboard
# ('item1', 'item2', 'item3')
# 配列リテラル生成
$items = Get-Clipboard
"@(" + (($items | ForEach-Object { "`"$_`"" }) -join ", ") + ")" | Set-Clipboard
# @("item1", "item2", "item3")
# Markdownリスト生成
Get-Clipboard | ForEach-Object { "- $_" } | Set-Clipboard
# HTMLリスト生成
@("<ul>") + (Get-Clipboard | ForEach-Object { " <li>$_</li>" }) + @("</ul>") | Set-Clipboard
データ抽出
※ 全文処理(-Raw 使用)
以下の正規表現は簡易的な抽出用であり、厳密なバリデーションではありません。
# メールアドレス抽出
$text = Get-Clipboard -Raw
[regex]::Matches($text, '[\w.+-]+@[\w.-]+\.\w+').Value |
Select-Object -Unique | Set-Clipboard
# ※ 簡易パターンのため、一部の特殊なアドレスは取りこぼす可能性があります
# URL抽出
[regex]::Matches($text, 'https?://[^\s<>"]+').Value |
Select-Object -Unique | Set-Clipboard
# 数値だけ抽出
[regex]::Matches($text, '\d+').Value | Set-Clipboard
# 日付抽出(YYYY-MM-DD形式)
[regex]::Matches($text, '\d{4}-\d{2}-\d{2}').Value | Set-Clipboard
# ※ 形式のみのチェックです。2099-99-99 なども抽出されます
# IPアドレス抽出
[regex]::Matches($text, '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}').Value | Set-Clipboard
# ※ 形式のみのチェックです。999.999.999.999 なども抽出されます
便利関数の定義
# プロファイルに追加して常用
function Edit-Clipboard {
param(
[Parameter(Mandatory)]
[scriptblock]$Process,
[switch]$Raw
)
$clip = if ($Raw) { Get-Clipboard -Raw } else { Get-Clipboard }
$clip | ForEach-Object $Process | Set-Clipboard
}
# 使用例
Edit-Clipboard { $_.ToUpper() }
Edit-Clipboard { $_ -replace "old", "new" }
Edit-Clipboard { if ($_ -match "error") { $_ } }
Edit-Clipboard -Raw { [regex]::Matches($_, '\d+').Value }
# よく使う処理を関数化
function ConvertTo-UpperClip { Get-Clipboard | ForEach-Object { $_.ToUpper() } | Set-Clipboard }
function Remove-EmptyLines { Get-Clipboard | Where-Object { $_.Trim() -ne "" } | Set-Clipboard }
function Sort-ClipLines { Get-Clipboard | Sort-Object | Set-Clipboard }
function Get-UniqueLines { Get-Clipboard | Select-Object -Unique | Set-Clipboard }
複合処理の例
# ログからエラー行を抽出・整形
Get-Clipboard |
Where-Object { $_ -match "ERROR" } |
ForEach-Object { $_ -replace '^\[.*?\]\s*', '' } |
Select-Object -Unique |
Sort-Object |
Set-Clipboard
# CSVデータを整形(複雑なCSVにも対応)
Get-Clipboard |
ConvertFrom-Csv |
Where-Object { $_.Status -eq "Active" } |
Select-Object Name, Email |
ConvertTo-Csv -NoTypeInformation |
Set-Clipboard
まとめ
| 操作 | コマンド例 |
|---|---|
| 大文字変換 | ForEach-Object { $_.ToUpper() } |
| 空行削除 | Where-Object { $_.Trim() -ne "" } |
| 重複削除 | Select-Object -Unique |
| ソート | Sort-Object |
| 置換 | ForEach-Object { $_ -replace "a","b" } |
| フィルタ | Where-Object { $_ -match "pattern" } |









