質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

解決済

1回答

441閲覧

bash:正規表現でURLを保持したままHTMLのタグをjsp用のタグに一括置換したい

Webtuuuu

総合スコア30

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

0クリップ

投稿2019/08/22 03:12

##やりたいこと
ローカルにあるHTMLファイルの中に記述されているインクルード記述部分を
jspファイル用の記述に置換しようとしています。
このときファイル内にはいくつかインクルード記述があるため一括で置換をかけようとしていますが
インクルード先に指定しているURLはバラバラなため正規表現でURLを指定しています。

また、この処理はループ処理で
A.htmlを置換→B.htmlを置換→C.htmlを置換
と処理しておりファイル数も可変です。

whileでファイルの中身を1行ずつ処理することも検討しましたが、
ファイル数が膨大なため一括置換が理想です。

▼HTML内にある探したい文字列

html

1<!--#include virtual="/testA/text.txt" --> 2<!--#include virtual="../testA/testB/index.html" --> 3<!--#include virtual="../../testA/testB/testC/index.txt" -->

▼正規表現で検索

txt

1<!--#include virtual="((/|../)[-_..!a-zA-Z0-9/]+)" -->

エディタ上で、上記の記述で検索をかければきちんと探したい文字列とマッチします。

▼実際に書いたシェル

bash

1sed -i -e 's?<!--#include virtual="((/|../)[-_..!a-zA-Z0-9/]+)" -->?<a href="((/|../)[-_..!a-zA-Z0-9/]+)"></a>?g' index.html

##発生している問題
sedを使用してファイル内のマッチするエリアを一括置換かけようとしましたが、なぜか実際に書いたシェルでは動きませんでした。

文法ミスを疑って、いったん正規表現なしで直接指定して試してみたところきちんと置換されました。
↓以下で試したらきちんと動きました。

bash

1sed -i -e 's?<!--#include virtual="/testA/text.txt" -->?<jsp:include page="/testA/text.txt" flush="true" />?g' index.html

なぜこれが動かないのか理由がわからないためご教示いただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

sed -i -e 's?<!--#include virtual="((/|../)[-_..!a-zA-Z0-9/]+)" -->?<a href="((/|../)[-_..!a-zA-Z0-9/]+)"></a>?g' index.html

sedコマンドの内容が、正規表現も違うし置換文字列も意味不明です。

sed -i -e 's?<!--#include virtual="/testA/text.txt" -->?<jsp:include page="/testA/text.txt" flush="true" />?g' index.html

"~"を保存するように正規表現で書くと、

Bash

1sed -i -e 's?<!--#include virtual=("[^"]*") -->?<jsp:include page=\1 flush="true" />?g'

正規表現には大きく3種類あります(それぞれ多少のバリエーション有り)。
1.基本正規表現 (grep/sed/awkなど)
2.拡張正規表現 (egrepや多くのツール)
3.拡張正規表現のPerl拡張 (多くの言語やツール)

1と2は非互換。3は2の上位互換です。

お使いのエディターは拡張正規表現対応だと思います。普通はそうです。
それをsedで使うためには非互換部分の修正が必要です。今回は括弧の部分とか+とか。
あるいは、Linuxなどで使われるgnuのsedだと、sed -rとすることで拡張正規表現を使うことも出来ますので、拡張正規表現で表された正規表現があり、非互換修正が面倒なときはsed -rを使います。(MacOSだとsed -Eらしい)

投稿2019/08/22 03:39

編集2019/08/22 03:56
otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Webtuuuu

2019/08/22 04:06

回答ありがとうございます。 頂いたコマンドで理想としていた挙動が実現できました。 シェルについては単純に勉強不足で正規表現についてもきちんと理解できていませんでした。 もっと勉強します…。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問