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

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

新規登録して質問してみよう
ただいま回答率
85.49%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

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

正規表現

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

Q&A

解決済

3回答

2497閲覧

シェルスクリプト、ダブルクォーティングを対象に特定部分文字出力

Fujic

総合スコア7

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

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

正規表現

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

0グッド

0クリップ

投稿2020/05/22 05:35

編集2020/05/22 13:49

前提・実現したいこと

シェルスクリプトの部分文字列抽出について。
以下の例を達成するにはどのように出力、または変数を定義すればいいでしょうか。
<例>

example=' "aaa","b,bb","ccc" '

①aaaのみ変数に格納または出力
②b,bbのみ変数に格納または出力

2つともダブルクォーテーションを含まずに出力したいです。
前提として、
・example定義する際に、ダブルクォーテーションを必ず記載されているものとします。
・フィールド内にはカンマ(',')が含む場合もあるとします。

発生している問題・エラーメッセージ

b,bbが分割されてしまう。

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

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

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

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

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

Orlofsky

2020/05/22 06:19

質問を直しては? 「コーティング coating」は「塗る」、って意味。 ↓ ダブルクォーテーション・マーク double quotation mark でくくる(はさむ) "文字列" ことをダブルクォーティング double quoting という。
Fujic

2020/05/22 06:25

タイトル、内容の一部変更いたしました。ご指摘ありがとうございます
guest

回答3

0

sedを使ってもよければ

bash

1$ echo `echo $example | sed -e 's/\"([^\"]+)\",?/\1 /g'` 2aaa b,bb ccc 3 4$ A=( `echo $example | sed -e 's/\"([^\"]+)\",?/\1 /g'` ) 5$ echo ${A[1]} 6b,bb

投稿2020/05/22 14:15

etsuhisa

総合スコア416

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

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

Fujic

2020/05/22 15:55

頂いた回答を参考にsed とevalを用いることで解決できました。 フィールドに空白を含む想定です。 eval A=( `echo ${example} | sed -e 's/\","/\" \"/g'` ) echo ${A[0]} echo ${A[1]} echo ${A[2]} > aaa b,b b -----(空白を含む想定) ccc
etsuhisa

2020/05/23 07:48

なるほど、非常にシンプルですね。参考になりました。
guest

0

ベストアンサー

中身にカンマを含まない前提で、

Bash

1example=' "aaa","bbb","ccc" ' 2 3IFS=, 4eval A=($example) 5echo "===${A[0]}===" 6echo "===${A[1]}===" 7echo "===${A[2]}==="

ダブルクォートの中にカンマが含まれると、空白になってしまいます。
また、evalを使うので、外部入力(ウェブから入力されたデータなど)を使う場合は、ノーチェックで実行すると脆弱性になります。example='$(rm -rf ~)'など。

投稿2020/05/22 11:41

編集2020/05/22 11:45
otn

総合スコア84491

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

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

Fujic

2020/05/22 13:51

回答ありがとうございます。 私の質問が曖昧ですみませんでした。 今回はフィールド内にカンマを含む場合もあるので質問内容の修正をいたしました。
otn

2020/05/22 14:22

内部に空白は含まれますか?
Fujic

2020/05/22 14:41

空白は含みません
otn

2020/05/22 14:43

であれば、空白をカンマに戻せば良いので、 echo "===${A[0]// /,}===" [1]以下も同様
Fujic

2020/05/22 15:53

再検討したところ空白を含む場合もあると判断いたしましたので 頂いた回答を参考にsed とevalを用いることで解決できました。 eval A=( `echo ${example} | sed -e 's/\","/\" \"/g'` ) echo ${A[0]} echo ${A[1]} echo ${A[2]} > aaa b,b b -----(空白を含む想定) ccc
guest

0

""の中にコンマが含まれる可能性がないと断言できるなら話は簡単ですが、そうでないなら以下のような手を検討する必要があるでしょう。

GNU awk 4.0以上が使えるのであれば、組込変数FPATを利用するのが簡単そうです。

perlが使えるならText::ParseWordsという標準モジュールを使うと簡単です。

投稿2020/05/22 06:23

KojiDoi

総合スコア13671

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問