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

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

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

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

3回答

3533閲覧

htmlファイルの1行目に入っているであろうxml宣言を削除したい。

tomomo

総合スコア430

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

1クリップ

投稿2017/10/12 02:45

編集2017/10/12 04:16

タイトルどおりなのですが、非常にたくさんのファイル(サイト)を所有しているためコマンドで一括処理できないものかと思っています。

bash

1find ${work_dir} -type f -name "*.html" | xarg sed -i 's/<?xml (.)+\n>//g' 2 3↓(誤りを修正) 4 5find ${work_dir} -type f -name "*.html" | xarg sed -i 's/<?xml (.)+\n//g'

・htmlファイルの1行目に入っているであろう<?xml version="1.0"...>のような
xml宣言を行ごと削除したい。
・ファイルの形式がUTFだったりShift-JISだったりバラバラである。
・LinuxあるいはMacで作業できる環境にある。

過去の記事を見るとsedで改行のくだりは面倒らしいのでそこも見直さないといけないのですが、
そもそも、xml宣言が'(.)+'で引っかかってないようで。

ご教授いただけないでしょうか。
よろしくお願いします。

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

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

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

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

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

guest

回答3

0

正規表現の末尾が\n>となっていますが、改行はXML宣言より外側にあるのが普通ではないでしょうか。

投稿2017/10/12 02:56

maisumakun

総合スコア145183

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

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

tomomo

2017/10/12 03:16

素早い回答、ありがとうございます。 おっしゃるとおり、>は不要と思います。 いくつか修正を繰り返しているのですが変わらず、一旦改行のくだりは置いといて、 下記みたいなのを実行してみるも変わらずで。 結局"xarg sed"以降どのように書けば良いのかに悩んでおります。 xarg sed -i 's/<?xml (.)+/hogehoge/g'
guest

0

対象が間違いなく1行目にあるということなら、行番号を指定してあげればよいのでは。

find ${work_dir} -type f -name "*.html" -exec sed -i '1s/<?xml (.)+\n//g'

投稿2017/10/12 04:23

KojiDoi

総合スコア13671

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

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

tomomo

2017/10/12 09:46

回答ありがとうございます。 "入っているであろう"なんで入ってたりなかったり。 もう少しわかりやすい表現にすればよかったですよね。すみません。
guest

0

ベストアンサー

下記のように考えましたが、sedで処理する行を1行目だけとするにはどうすればいいかがぱっと思いつきませんでした。

bash

1find ${work_dir} -type f -name "*.html" -exec sed -i '/^<?.*?>$/d' {} \;

この場合、同じような<? ... ?>のみとなる行が2行目以降にある場合も削除されてしまいます。
上記でご対応いただく場合は、事前にgrep等で1行目以外には同様の記述内容が存在しないことをご確認頂いた方がよいかもしれません。


追記:
内容にPHPタグが含まれるのであれば質問に記載頂きたかったです。
また、invalidなxml宣言も取り除くであれば下記ではいかがでしょうか。

bash

1find ${work_dir} -type f -name "*.html" -exec sed -i '/^<?xml[^>]*>$/d' {} \;

投稿2017/10/12 03:55

編集2017/10/12 04:21
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tomomo

2017/10/12 04:15

回答、ありがとうございます。 PHPタグも消えてしまうだろうと思ったので"<?\xml"で実行しましたがダメでした。 また提示いただいたコマンドもそのまま実行させてもらいましたがダメでした。 あれからいろいろ削ってみたのですが、検索条件の方が引っかかってないらしく... sed -i 's/<?xml (.)+/hogehoge/g' <?xml version="1.0" encoding="Shift_JIS" > <- 変換されず sed -i 's/<?xml/hogehoge/g' <?hogehoge version="1.0" encoding="Shift_JIS" > <- 変換される。 (.)+ の書き方が誤っているのでしょうか。(.*も同じ。) アイデアとお時間ありましたら、またよろしくお願いします。
tomomo

2017/10/12 09:50

提示していただいたコマンドでは変換できなかったのですが、"exec"のくだりなど非常に参考になりました。 以下で目的を果たすことができました。 ```bash find ${work_dir} -type f -name "*.html" -exec sed -i -r '/<?xml (.)$/d' {} \; ``` "-r"オプションを付加して正規表現と、findのexec。 自分のやってた、"xargc sed" では"sed:1 ... command i expects \ followed by text"なるエラーが出る。 (execでいけたのでこのエラーは特に調べず。) ありがとうございました。
退会済みユーザー

退会済みユーザー

2017/10/12 14:04

コマンドが提示した内容では期待の動作にならなかったとのことで、お手数おかけしました。 可能であれば、今回処理を実行した環境を記載いただけると助かります。 MacOS上で作業されたのでしょうか。
tomomo

2017/10/16 00:37

解決した環境は、"CentOS 7.4"、 上で記載した"sed:1 ... command i expects..."なるエラーがでた環境は"OSX El Capitan 10.11.6"、 です。
退会済みユーザー

退会済みユーザー

2017/10/16 01:22

ありがとうございます。 なかなかOSによって同じコマンドでも動きが違ったりするので難しいところです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問