カテゴリー
【Sed活用講座】パターンスペースとホールドスペースの使い方を理解する
※ 当ページには【広告/PR】を含む場合があります。
2021/12/11
2022/09/30
sed -e 's/hoge/piyo/'
ウェブサイト型のBashエミュレータを利用する
Sedのパターンスペースとは何かを理解しよう
$ sed -r '' <<EOF
1行目
2行目
3行目
4行目
5行目
6行目
7行目
8行目
9行目
10行目
EOF
#👇実行結果
1行目
2行目
3行目
4行目
5行目
6行目
7行目
8行目
9行目
10行目
''
「何もしない」
何もしない
p
「何もしない」
-n
$ sed -n -r '' <<EOF
1行目
2行目
3行目
4行目
5行目
6行目
7行目
8行目
9行目
10行目
EOF
#👇結果は何も出力されない
p
$ sed -n -r 'p' <<EOF
1行目
2行目
3行目
4行目
5行目
6行目
7行目
8行目
9行目
10行目
EOF
#👇実行結果
1行目
2行目
3行目
4行目
5行目
6行目
7行目
8行目
9行目
10行目
-n (--quiet, --silent)
-n
$ sed -n -r '
3p
4p
7p
10p
' <<EOF
1行目
2行目
3行目
4行目
5行目
6行目
7行目
8行目
9行目
10行目
EOF
#👇実行結果
3行目
4行目
7行目
10行目
-n
sed初心者あるある〜二重に出力されてしまう
$ sed -r '
3p
4p
7p
10p
' <<EOF
1行目
2行目
3行目
4行目
5行目
6行目
7行目
8行目
9行目
10行目
EOF
#👇実行結果
1行目
2行目
3行目
3行目
4行目
4行目
5行目
6行目
7行目
7行目
8行目
9行目
10行目
10行目
p
-n
つまり「パターンスペース」とは
+ パターンスペースとは、入力された行の一時保存場所である
+ Sedのスクリプトが適用されるのは、
パターンスペースに置かれた行に対してである
+ パターンスペースに置かれた一行分がスクリプトに処理され、
順次各行ごとに処理が実行される、というサイクルを繰り返す
+ パターンスペースは原則一行づつ読み込まれ、
パターンスペースに置かれた古い行は上書きされる
+ 複数のSedスクリプトが指定されている場合、パターンスペースに置かれた
行でスクリプト順に逐次適用される
+ Sedの処理は、デフォルトでパターンスペースが順次標準出力される
Sedのホールドスペースとは何かを理解しよう
コマンドシンボル | 作用 |
---|---|
x | パターンスペースとホールドスペースのテキストを交換 |
h | パターンスペースのテキストでホールドスペースを置換 |
H | パターンスペースのテキストをホールドスペースの末尾へ改行+追加 |
g | ホールドスペースのテキストでパターンスペースを置換 |
G | ホールドスペースのテキストをパターンスペースの末尾へ改行+追加 |
ホールドスペースを使った事例
$ sed -n -r '
1!G # 1行目以外ならホールドスペース > パターンスペースへ末尾追加
h # 全ての行でパターンスペース > ホールドスペースで置換
$p # 最後の行ならパターンスペースを標準出力
' <<EOF
1行目
2行目
3行目
4行目
5行目
6行目
7行目
8行目
9行目
10行目
EOF
#👇実行結果
10行目
9行目
8行目
7行目
6行目
5行目
4行目
3行目
2行目
1行目
$ func_name='getAssetGetConfig \(asset\)'
$ sed -n -r '
#👇書き換える関数をループ処理で修正
/'"$func_name"'/ {
:loop
/\}$/! {
N
#👇出力される文字列で要らない部分を削除
s-internalapi/asset/--
s-/get/--
b loop
}
p
}
#👇書き換える関数以外は通常の標準出力
/'"$func_name"'/!p
' <<EOF
setAssetHost (assetHost) {
this.assetHost = assetHost;
}
getAssetGetConfig (asset) {
return \`\${this.assetHost}/internalapi/asset/\${asset.assetId}.\${asset.dataFormat}/get/\`;
}
EOF
#👇出力結果
#👇関数の中身を期待通りに書き換えることが出来る
setAssetHost (assetHost) {
this.assetHost = assetHost;
}
getAssetGetConfig (asset) {
return `${this.assetHost}/${asset.assetId}.${asset.dataFormat}`;
}
つまり「ホールドスペース」とは
+ パターンスペースに対して独立した保存領域を持っている
+ 反復処理を伴うような複雑な処理に利用できる
+ パターンスペースの行の読込みサイクルにも関係なく、
Sed処理中はずっとテキストの内容を保持できる
+ パターンスペースとの間でデータを柔軟にやり取りできる
+ 巨大なテキストも丸ごと保持はできるが、
すべての入力してしまうとメモリを圧迫し、
処理パフォーマンスが低下する恐れがあることに注意
まとめ
参考サイト
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー