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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

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

sh

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

Q&A

解決済

3回答

1588閲覧

awkコマンド 第一引数に括弧やカンマを含む

kty_kk

総合スコア4

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

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

sh

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

0グッド

1クリップ

投稿2021/07/26 05:43

編集2021/07/26 08:29

①test.txt

spinrtf(●●,△△,××)
sprintf(◆◆,■■,▼▼)
・・・
・・・

上記の様にリスト化されたsprintf関数に使用されている第一引数を取得するために下記をシェル内に記載しています。

bash

1awk '-F[(,]' '{print $2}' test,txt

しかし、第一引数にカンマ、スペース、括弧が更にある場合取得できず困っています。

例)
・sprintf ( (abc)abcd,~,~)

上記例の様な場合、 『 (abc)abcd』を取得したいです。

>awk '-F[(,]' '{print $2}' test,txt
→こちらを変化させて取得できる方法はありませんでしょうか。

【補足】

●現ソース

bash

1 2#greplist=検索したい関数名を記載し事前準備(今回だとsprintfのみ) 3 4#対象ファイル一覧取得 5find `pwd` -mindepth 2 -a -type f >checklist.txt 6 7#対象ファイル内ループ(checklist.txt) 8####対象ファイル一覧からgreplistに記載されている関数名が使われている箇所を検索し、全て出力(grefunction.txtに)######### 9while read line;do 10 11 #事前用意した関数名一覧内をループ(greplist.txt) 12 while read key;do 13 14 grep -wsh $key $line >>grefunction.txt 15 16 done<greplist.txt 17 18done<checklist.txt 19################################################################################################################# 20 21#上記で出力したgrefunction.txt内の、sprintf(~,~,~)の第一引数を取得し、一覧化 22awk '-F[(,]' '{print $2} grefunction.txt>arg.txt 23 24#第一引数を一覧化したもの(arg.txt)から、重複を削除するためにuniqを使用 25sort arg.txt | uniq>hensu.txt 26 27#対象ファイルループ(hensu.txt) 28###重複削除した第一引数一覧を$sargとし、$sargが使われている箇所を全て出力 29while read sarg;do 30 31 cd($dirname $0) 32 grep -wnsr $sarg ./* >>totalcheck.txt 33 34done<hensu.txt 35 36

やりたいこととしては、
①対象配下で使われているsprintf関数を全て取得
➁sprintfの第一引数を全て取得しリスト化(重複は削除)
③第一引数を対象配下に対し再度抽出する。(同様の第一引数名が様々なところで使用されているため)

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

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

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

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

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

guest

回答3

0

ベストアンサー

私の回答ですね。 https://teratail.com/questions/348177

第一引数に、カンマも括弧も含まれないのであれば、

という前提付きでの回答ですが、その時の、もし含まれるとしたらの想定は関数呼び出しでした。
sprintf(foo(x,y),z)みたいな。

含まれるというコメントが付けば、面倒くさいけどこうすれば」と書こうと思っていたのですが、数週前のことなのでそのときの案は忘れました。

カンマが含まれないのなら簡単で、

sh

1awk -F, '{sub(/^ *sprintf *( */,"",$1);print $1}'

前提条件ゼロでどの引数にも任意の式を許すなら、括弧のネストを処理するために再帰機能を持った正規表現を扱える言語とか構文解析専用ツールでないと無理でしょう。

投稿2021/07/26 12:13

編集2021/07/26 12:18
otn

総合スコア85901

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

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

kty_kk

2021/07/27 06:50

前回に引き続きご回答ありがとうございます。まとめて質問できず申し訳ありません。 上記回答内容で実現することができました。 考慮についても記載いただいたためベストアンサーとさせていただきます。
guest

0

sed じゃだめですかね?

bash

1echo "sprintf ( (abc)abcd,~,~)" | sed 's/^[^(]*(//' | sed 's/,.*$//'

投稿2021/07/26 11:59

takasima20

総合スコア7464

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

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

kty_kk

2021/07/27 06:49

ご回答ありがとうございます。 仰っていただいた方法で実現できました。ありがとうございます!
guest

0

正規表現一発で対応するのは無理でしょう。

対象がawkのソースで、なおかつ";"のような文字列定数が含まれていないとすると、以下のような感じでアドホックにやれないことはないです。

そうした仮定が成り立たないとなると、ソースの整形とか構文解析とかを考える必要があり、awkのワンライナーでは到底やってられないでしょう。

# test.awk { match($0, /sprint([^;]*)(;|$)/); x = (substr($0, RSTART, RLENGTH)); sub(/sprintf *(/, "", x); match(x, /[^,]*/); print substr(x, RSTART, RLENGTH); }
$ echo 'sprintf ( (abc)abcd,~、~) ' | awk -f test.awk (abc)abcd

投稿2021/07/26 07:24

KojiDoi

総合スコア13692

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

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

kty_kk

2021/07/26 08:32

ご回答ありがとうございます。 念のため実際のソースを補足として記載いたしました。 現状確認しているパターンとしては ・sprintf(abc,def,ghi) ・sprintf( (abc)abcd.efg,~,~) ・sprintf( (abc)abcd, ~, ~) という形になっています。対象をアドホックにしてしまうと汎用性が下がってしまうので その他の手段で対応したいのですが上記補足欄に記載したソースを修正してなんとかならないでしょうか…
KojiDoi

2021/07/26 09:29

> 記載したソースを修正してなんとかならないでしょうか… 無理です。最終的に何をしたいのか知りませんが、抜本的に方針を考え直したほうがいい気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問