回答編集履歴
3
変更
answer
CHANGED
@@ -4,10 +4,10 @@
|
|
4
4
|
|
5
5
|
- [環境に依存しないワンライナーを書くならsedよりperlの方がいい - Qiita](http://qiita.com/takc923/items/8654d69008e921c9c9fb)
|
6
6
|
|
7
|
-
何通りか書いておきます.
|
7
|
+
何通りか書いておきます.
|
8
8
|
|
9
9
|
```bash
|
10
|
-
perl -0pe 's/<title>(
|
10
|
+
perl -0pe 's/<title>(.*?)<\/title>\K/\n<h1>$1<\/h1>/s' < before.html > after.html
|
11
11
|
```
|
12
12
|
|
13
13
|
```bash
|
@@ -15,10 +15,9 @@
|
|
15
15
|
```
|
16
16
|
|
17
17
|
```bash
|
18
|
-
perl -0pe 's/<title>(
|
18
|
+
perl -0pe 's/<title>([^<]*+)<\/title>\K/\n<h1>$1<\/h1>/' < before.html > after.html
|
19
19
|
```
|
20
20
|
|
21
|
-
|
22
21
|
# 解説
|
23
22
|
|
24
23
|
`-0`オプション: 行単位ではなくEOFがくるまでの入力全体に一気にマッチさせる
|
2
gフラグを削除
answer
CHANGED
@@ -7,15 +7,15 @@
|
|
7
7
|
何通りか書いておきます.一番上が最もおすすめです.
|
8
8
|
|
9
9
|
```bash
|
10
|
-
perl -0pe 's/<title>([^<]*+)<\/title>\K/\n<h1>$1<\/h1>/
|
10
|
+
perl -0pe 's/<title>([^<]*+)<\/title>\K/\n<h1>$1<\/h1>/' < before.html > after.html
|
11
11
|
```
|
12
12
|
|
13
13
|
```bash
|
14
|
-
perl -0pe 's/<title>([^<]*)<\/title>\K/\n<h1>$1<\/h1>/
|
14
|
+
perl -0pe 's/<title>([^<]*)<\/title>\K/\n<h1>$1<\/h1>/' < before.html > after.html
|
15
15
|
```
|
16
16
|
|
17
17
|
```bash
|
18
|
-
perl -0pe 's/<title>(.*?)<\/title>\K/\n<h1>$1<\/h1>/
|
18
|
+
perl -0pe 's/<title>(.*?)<\/title>\K/\n<h1>$1<\/h1>/s' < before.html > after.html
|
19
19
|
```
|
20
20
|
|
21
21
|
|
@@ -44,3 +44,5 @@
|
|
44
44
|
`<`以外の0回以上の繰り返しに対する**最長**マッチ.
|
45
45
|
文字種を限定することで最長マッチに安心してかけられます.
|
46
46
|
こちらは**バックトラッキングの抑制**を明示しており,無駄が全く無いことが保証されます.
|
47
|
+
|
48
|
+
また普通はあり得ませんが,もし`<title></title>`が複数回現れる場合は`g`フラグを有効にすることで対処します.
|
1
補足
answer
CHANGED
@@ -4,10 +4,21 @@
|
|
4
4
|
|
5
5
|
- [環境に依存しないワンライナーを書くならsedよりperlの方がいい - Qiita](http://qiita.com/takc923/items/8654d69008e921c9c9fb)
|
6
6
|
|
7
|
+
何通りか書いておきます.一番上が最もおすすめです.
|
8
|
+
|
7
9
|
```bash
|
10
|
+
perl -0pe 's/<title>([^<]*+)<\/title>\K/\n<h1>$1<\/h1>/g' < before.html > after.html
|
11
|
+
```
|
12
|
+
|
13
|
+
```bash
|
14
|
+
perl -0pe 's/<title>([^<]*)<\/title>\K/\n<h1>$1<\/h1>/g' < before.html > after.html
|
15
|
+
```
|
16
|
+
|
17
|
+
```bash
|
8
18
|
perl -0pe 's/<title>(.*?)<\/title>\K/\n<h1>$1<\/h1>/gs' < before.html > after.html
|
9
19
|
```
|
10
20
|
|
21
|
+
|
11
22
|
# 解説
|
12
23
|
|
13
24
|
`-0`オプション: 行単位ではなくEOFがくるまでの入力全体に一気にマッチさせる
|
@@ -16,4 +27,20 @@
|
|
16
27
|
|
17
28
|
`\K`言明:
|
18
29
|
**サブパターンは保持しつつ**,マッチング開始位置をそこにリセットする.
|
19
|
-
これを末尾に持ってくると**「マッチした場所に挿入」**という処理が無駄な置換をすることなく実現できる.
|
30
|
+
これを末尾に持ってくると**「マッチした場所に挿入」**という処理が無駄な置換をすることなく実現できる.
|
31
|
+
|
32
|
+
`(.*?)`:
|
33
|
+
任意の文字の0回以上の繰り返しに対する最短マッチ.
|
34
|
+
`s`フラグを入れないと改行文字が対象にならない点に注意してください.
|
35
|
+
1文字マッチさせるごとに「後ろに`</title>`があるか?」をチェックするのであまり効率は良くないです.
|
36
|
+
|
37
|
+
`[^<]*`:
|
38
|
+
`<`以外の0回以上の繰り返しに対する**最長**マッチ.
|
39
|
+
文字種を限定することで最長マッチに安心してかけられます.
|
40
|
+
ただしこれはまだ不必要にバックトラッキングを起こす可能性があります.
|
41
|
+
(Perlの正規表現エンジンはかなり賢いので最適化でうまいことやってくれる可能性もあります)
|
42
|
+
|
43
|
+
`[^<]*+`:
|
44
|
+
`<`以外の0回以上の繰り返しに対する**最長**マッチ.
|
45
|
+
文字種を限定することで最長マッチに安心してかけられます.
|
46
|
+
こちらは**バックトラッキングの抑制**を明示しており,無駄が全く無いことが保証されます.
|