teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

変更

2016/09/01 02:39

投稿

mpyw
mpyw

スコア5223

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>([^<]*+)<\/title>\K/\n<h1>$1<\/h1>/' < before.html > after.html
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>(.*?)<\/title>\K/\n<h1>$1<\/h1>/s' < before.html > after.html
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フラグを削除

2016/09/01 02:39

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -7,15 +7,15 @@
7
7
  何通りか書いておきます.一番上が最もおすすめです.
8
8
 
9
9
  ```bash
10
- perl -0pe 's/<title>([^<]*+)<\/title>\K/\n<h1>$1<\/h1>/g' < before.html > after.html
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>/g' < before.html > after.html
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>/gs' < before.html > after.html
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

補足

2016/08/31 23:17

投稿

mpyw
mpyw

スコア5223

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
+ こちらは**バックトラッキングの抑制**を明示しており,無駄が全く無いことが保証されます.