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

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

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

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

解決済

3回答

4275閲覧

sedで置換を行いたい

hh_t

総合スコア38

sed

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

0クリップ

投稿2017/11/07 09:44

編集2017/11/07 09:45

以下のxmlの:をすべて_に変換したいです。

これで試しましたが、変換されません。ご教示頂けますでしょうか。
sed -e "s/<([^>]+?):(.*)>/<\1_\2>/g

可能であれば同様の処理をディレクトリ内すべてのファイルに行う方法もお願い致します。

xml

1<?xml version="1.0" encoding="UTF-8" ?> 2<gml:Surface gml:id="sf1"> 3 <gml:patches> 4 <gml:PolygonPatch> 5 <gml:exterior> 6 <gml:Ring> 7 <gml:curveMember xlink:href="#cv1_0"/> 8 </gml:Ring> 9 </gml:exterior> 10 </gml:PolygonPatch> 11 </gml:patches> 12</gml:Surface> 13<gml:Curve gml:id="cv2_0"> 14 <gml:segments> 15 <gml:LineStringSegment> 16 <gml:posList> 17 35.67133001 139.75479002 18 35.67136001 139.75469002 19 35.67159001 139.75412002 20 35.67170001 139.75384001 21 35.67175000 139.75372001 22 35.67184001 139.75351002 23 35.67203001 139.75305002 24 35.67207533 139.75292700 25 35.67165068 139.75268097 26 35.67062707 139.75210356 27 35.67055436 139.75206239 28 35.67131333 139.74985580 29 35.67121402 139.74978860 30 35.67113774 139.74972355 31 35.67104195 139.74962161 32 35.67078901 139.74924001 33 35.67083101 139.74951301 34 35.67083101 139.74952402 35 35.67083101 139.74978101 36 35.67083101 139.74980802 37 35.67083101 139.74995801 38 35.67080600 139.75006701 39 35.67055901 139.75112902 40 35.67043801 139.75183601 41 35.67041196 139.75198513 42 35.67040901 139.75200201 43 35.67038601 139.75213801 44 35.67026201 139.75286301 45 35.66990501 139.75431301 46 35.66957101 139.75528801 47 35.66950001 139.75549502 48 35.66944701 139.75564801 49 35.66911201 139.75662602 50 35.66903601 139.75687201 51 35.66902201 139.75691701 52 35.66900901 139.75696101 53 35.66871901 139.75790501 54 35.66870501 139.75795202 55 35.66868401 139.75802101 56 35.66869701 139.75801801 57 35.66892200 139.75804301 58 35.66962560 139.75851330 59 35.67016292 139.75721941 60 35.67062245 139.75610554 61 35.67063001 139.75611002 62 35.67074761 139.75617334 63 35.67133001 139.75479002 64 </gml:posList> 65 </gml:LineStringSegment> 66 </gml:segments> 67</gml:Curve> 68<ksj:DesignatedArea gml:id="da11137"> 69 <ksj:cda xlink:href="#sf11137"/> 70 <ksj:aac codeSpace="AdministrativeAreaCode.xml">13229</ksj:aac> 71 <ksj:pfn>東京都</ksj:pfn> 72 <ksj:lgn>西東京市</ksj:lgn> 73 <ksj:dac>1</ksj:dac> 74 <ksj:kda>第一種低層住居専用地域</ksj:kda> 75 <ksj:bar>40</ksj:bar> 76 <ksj:cbr>80</ksj:cbr> 77 <ksj:src>西東京市</ksj:src> 78 <ksj:pdt> 79 <gml:TimeInstant gml:id="da11137_TI1"> 80 <gml:timePosition>2011</gml:timePosition> 81 </gml:TimeInstant> 82 </ksj:pdt> 83 <ksj:rmk></ksj:rmk> 84</ksj:DesignatedArea>

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

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

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

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

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

guest

回答3

0

s/:/_/g
だけでいいです

投稿2017/11/07 09:58

MasakiHori

総合スコア3384

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

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

0

ベストアンサー

ところで、質問者さんがおわかりかどうかはっきりしないのですが

sedやtrはあくまでフィルターのように使うコマンドであり

sed -E 正規表現 input

などとしてもinputファイルは置き換わらない点は大丈夫でしょうか?ファイルの内容を書き換えるなら

sed -E 正規表現 file > output-dir/file

などとするのが普通の使い方であるように思います。


ちなみに正規表現そのものについてはMasakiHoriさんに一票です。

sed -e "s/<([^>]+?):(.*)>/<\1_\2>/g

ではうまくいかないとのことですが、例えば拡張正規表現を使ったとして

sed -E 's/(<[^:]+):([^>]+>)/\1_\2/g'

などと書いてみても

"<a:b></a:b>" => "<a_b></a_b>"

のような置換ならうまくいきますが、以下のように属性名の置換漏れが起きます。

"<a:b c:d></a:b>" => "<a_b c:d></a_b>"

要件が「「:をすべて_に変換」ならMasakiHoriさんの回答にあるような単純なパターン置換で充分であり、中途半端にXMLの構文を意識したような正規表現を使わないようにしたほうがむしろ安全な気がします。


余談?:
ところでsedって最短一致は使えない気がします。例えば
echo aagaag | sed -E 's/.+?g/X/'
のように最短一致を指定したつもりでも結果は
X
になってしまいます。最短一致がサポートされているJavascriptなどで
console.log("aagaag".replace(/.+?g/, 'X')
とすれば、期待通り
Xaag
になってくれます。

これってsedで最短一致を使えないということであると思うのですが・・・

投稿2017/11/07 12:15

KSwordOfHaste

総合スコア18392

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

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

KojiDoi

2017/11/07 14:18

> sedで最短一致を使えないということであると思うのですが・・・ これは気付きませんでした。一つ勉強になりました。 ところで、sedで拡張正規表現を使うオプションは sed -Eではなくsed -rでは?
KSwordOfHaste

2017/11/07 15:02

実は「拡張正規表現」というのをKojiDojさん回答で初めて気づきまして・・・今までsedの正規表現ではグループは()でないとダメと思っていたのです!そこでmanをみたところ -E, -r, --regexp-extended use extended regular expressions in the script (for portability use POSIX -E). とあったので、-rでも-Eでもどちらでもよいように思いました。ポータビリティーのためにはPOSIX仕様である-Eがいいと読めたので自分の回答では-Eを指定してみたのです。
hh_t

2017/11/21 09:35

解決しました。 ありがとうございました。
guest

0

うまくいかないのは「基本正規表現」と「拡張正規表現」の違いによるものです。
下の二つを試してみて下さい。

$ echo '<a:b>'|sed -r -e "s/<([^>]+?):(.*)>/<\1_\2>/g" $ echo '<a:b>'|sed -e "s/<([^>]*):(.*)>/<\1_\2>/g"

同様の処理をディレクトリ内すべてのファイルに行う方法

bashなら、

for a in * cp $a $a.bak do sed -r -e "s/<([^>]+?):(.*)>/<\1_\2>/g" $a.bak > $a # 追記。ファイルの置きかえになっていなかったので done

perlを使う手もあります。
以下をコマンドラインで実行すると、カレントディレクトリの全ファイルで書きかえが実行され、元データは.bakの付いたファイルにバックアップされます。

perl -i.bak -pe "s/<([^>]+?):(.*)>/<\1_\2>/g" *

投稿2017/11/07 10:26

編集2017/11/07 13:59
KojiDoi

総合スコア13669

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問