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

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

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

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

3回答

332閲覧

シェルスクリプトで特定の場合のみ置換処理をしたい

sho88

総合スコア19

sed

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

1グッド

1クリップ

投稿2019/04/04 05:30

シェルスクリプトで特定の場合のみ、置換処理したいです。
特定の場合というのは括弧内の、(読点)のみ、特定文字への置換処理です。

具体的には、以下のような処理になります。
可能であれば、sedで置換できればと思っています。

ご教示頂けると幸いです。

置換前
カニ(ズワイガニ)、エビ(テナガエビ)
魚類(ホラアナゴ科、ゲンゲ科)

置換後
カニ(ズワイガニ)、エビ(テナガエビ) : 置換無し
魚類(ホラアナゴ科|ゲンゲ科)     : 、⇒ | へ置換

set0gut1👍を押しています

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

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

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

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

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

guest

回答3

0

括弧内に読点が複数あるケースもあるだろうと思って対応しました。
「括弧内の最初の読点を縦棒に置換する」を置換が成功する限り繰り返します。

sh

1cat <<END | 2カニ(ズワイガニ)、エビ(テナガエビ) 3魚類(ホラアナゴ科、ゲンゲ科) 4ウニ、ヒトデ、その他(生物) 5類人猿(チンパンジー、ボノボ、ゴリラ、オランウータン)、テナガザル 6END 7 8sed ':q;s/(([^、)]*)、([^)]*))/(\1|\2)/g;t q' 9 10=== 出力 === 11カニ(ズワイガニ)、エビ(テナガエビ) 12魚類(ホラアナゴ科|ゲンゲ科) 13ウニ、ヒトデ、その他(生物) 14類人猿(チンパンジー|ボノボ|ゴリラ|オランウータン)、テナガザル

投稿2019/04/04 13:38

編集2019/04/04 13:42
otn

総合スコア84667

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

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

sho88

2019/04/06 02:28

お礼が遅くなり申し訳ございません。 ご教示いただきありがとうございます。無事解決しました。 また質問させていただくこともあると思いますが、どうぞよろしくお願いいたします。
guest

0

ベストアンサー

どうしてもsedでないといけませんかね? 正規表現による置換ならperlの方が高機能で環境による仕様の違いもなくて楽なのですが。

echo '魚類(ホラアナゴ科、ゲンゲ科)、カニ(ズワイガニ)、エビ(テナガエビ)'|perl -pe 's/(?<!))、/\|/g'

追記:
のあとにという条件判定が使えないなら、正規表現一発での対応は難しいでしょう。

以下のスクリプトでは、カッコで含まれた部分を取り出し、その中身をで分割して|を介してくっつけ直すという方法を使ってみました。

echo '魚類(ホラアナゴ科、ゲンゲ科)、カニ(ズワイガニ)、エビ(テナガエビ)ウニ、ヒトデ、その他(生物)'|perl -pe '$s=sub{join("|",split(/、/, $_[0]))}; s/((.*?))/$s->($1)/ge'

投稿2019/04/04 08:07

編集2019/04/04 11:01
KojiDoi

総合スコア13671

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

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

sho88

2019/04/04 08:41

早速ありがとうございます。perlですか。便利そうですね。 不足しているパターンがあったので、追加します。 ご教示頂いた内容では、追加パターンも置換されるようです。 カニ(ズワイガニ)、エビ(テナガエビ) 魚類(ホラアナゴ科、ゲンゲ科) ウニ、ヒトデ、その他(生物) ←追加
KojiDoi

2019/04/04 11:03

そういうことは先に明確にしていただきたかった。 )のあるなしで対応を変えている(nonoichi123さんのもそこは同じ)なので、抜本的に作戦を変えざるを得ません。そして正規表現一発ではおそらく無理です。 ということで追記しておきました。
sho88

2019/04/06 02:25

申し訳ございません。 perlを使用した解決法をありがとうございます。無事解決しました。
guest

0

除外したい置換対象が「)、」だけであれば、
「)、」だけ別の値に置換してから、
「、⇒ |」置換をするのはどうでしょうか。

$ cat test.md
カニ(ズワイガニ)、エビ(テナガエビ)
魚類(ホラアナゴ科、ゲンゲ科)

$ sed s/)、/##/ test.md | sed s/、/|/ | sed s/##/)、/
カニ(ズワイガニ)、エビ(テナガエビ)
魚類(ホラアナゴ科|ゲンゲ科)

投稿2019/04/04 06:34

nonoichi123

総合スコア17

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

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

sho88

2019/04/04 08:40

早速ありがとうございます。不足しているパターンがあったので、追加します。 ご教示頂いた内容では、追加パターンも置換されるようです。 カニ(ズワイガニ)、エビ(テナガエビ) 魚類(ホラアナゴ科、ゲンゲ科) ウニ、ヒトデ、その他(生物) ←追加
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問