下記の条件で置換するための正規表現を教えてほしいです!
条件:スペースのうちカッコのなかにあるものだけをアンダーバーに置換
対象の文字列の特徴:
カッコはネストせず一重のみです
カッコは必ず閉じています
対象の文字列に出現するカッコとスペースは半角のみです
対象の文字列の例:
りんご ばなな(みかん ぶどう すもも) たい かじき ( )まぐろ(さんま あじ ) くじら
期待する置換結果:
りんご ばなな(みかん_ぶどう_すもも) たい かじき (_)まぐろ(さんま_あじ_) くじら
よろしくお願いします
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答4件
1
ベストアンサー
正規表現一発で実現するのは難しいのではないでしょうか。
perlのワンライナーなら行けそうです。
echo -e 'りんご ばなな(みかん_ぶどう_すもも)\nたい かじき ( )まぐろ(さんま あじ ) くじら' | perl -CSDA -pe 's/\((.*)\)/my $x=$1; $x=~s{ }{_}g; "($x)"/eg'
投稿2022/08/03 09:05
総合スコア13564
1
sed
で置換するなら一度では無理です。
Bash
1STR="$(cat inputfile)" 2STR2= 3while [ "$STR" != "$STR2" ] 4do 5 STR2="$STR" 6 STR=$(echo "$STR" | sed 's/\([^(]*([^) ]*\) /\1_/g') 7done 8 9echo "$STR"
置換後の指定で文字列でなくコールバック関数を指定できる言語だと、括弧内をコールバック関数に渡して関数内で空白を置換する。
sh
1ruby -ple '$_.gsub!(/\(.*?\)/){|x| x.gsub(/ /,"_")}' inputfile > outputfile
RubyやPerl以外の言語だと、ファイルを読んだり書いたりを明示的に書かないといけないので長くなりますが、Python等でも同様に出来ます。
投稿2022/08/03 09:01
編集2022/08/03 09:18総合スコア82959
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
1
bash置換ではなく、sedコマンドなどで使える正規表現の置換で
GNU awk の split 関数を使う場合。
bash
1#!/bin/bash 2 3set -eu 4 5text=$(cat <<EOT 6りんご ばなな(みかん ぶどう すもも) 7たい かじき ( )まぐろ(さんま あじ ) くじら 8EOT 9) 10 11echo "$text" | 12gawk '{ 13 nf = split($0, s, /[()]/, seps) 14 for (i=1;i<nf;i++) { 15 if (!(i%2)) gsub(/ /, "_", s[i]) 16 printf "%s%s", s[i], seps[i] 17 } 18 print s[i] 19}'
投稿2022/08/03 08:51
総合スコア18151
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
0
あなたは私の方法を試すことができます:
BASH
1$ str="たい かじき ( )まぐろ(さんま あじ ) くじら" 2$ echo ${str/()/ /_} 3たい かじき (_)まぐろ(さんま_あじ_) くじら
投稿2022/08/03 07:16
総合スコア65
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
回答へのコメント

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
同じタグがついた質問を見る
bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。
Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。
正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/08/04 05:22
2022/08/04 07:39
2022/08/05 13:25