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

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

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

Cygwinは、Unixのような環境を、Windows上で構築させるコマンドラインインターフェースです。

grep

grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

sed

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

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

Q&A

解決済

3回答

1743閲覧

【Unix】 関数の引数名の取り出し

fearless0603

総合スコア41

Cygwin

Cygwinは、Unixのような環境を、Windows上で構築させるコマンドラインインターフェースです。

grep

grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

sed

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

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

0グッド

0クリップ

投稿2016/09/05 06:52

trans("ああああ")
trans("いいいい")
trans('うううう')

のように関数の引数にキーが設定されているものの、キー名を取り出すには

$ grep -o -h "trans(.*)" * | sed -e "s/trans(['\"]\(.*\)['\"])/\1/"

で、

ああああ いいいい うううう

のように取り出せますが、

1行に

コード trans("ええええ"), $sample[$example->id]) }}{trans('おおおお')

のようにtransが2回出てきた場合、上のunixのコードを記入しても

ええええ"), $sample[$example->id]) }}{trans('おおおお

としか出力されません。「ええええ"), $sample[$example->id]) }}{trans('おおおお」の部分がsed文を書いたときに(.*)のグループとしてみなされているのがわかるのですが、

ええええ おおおお

とできれば改行して、されにキーの要素のみを取り出すにはどうしたらいいのでしょうか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

grepの段階で1つ1行にして、

Bash

1grep -o -h "trans([^)]*)" * | sed -e "s/trans(['\"]\([^)]*\)['\"])/\1/"

で。

投稿2016/09/05 14:21

otn

総合スコア84538

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

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

kodai

2016/09/05 23:11

なるほど。-o はこんな挙動になるんですね。
fearless0603

2016/09/06 01:52 編集

grep -o -h "trans([^)]*)" * この箇所について、[^)]で )に不一致。 *で、直前の)の一文字以上の繰り返しに一致 という意味になるのだと思いますが、 なぜ、"trans([^)]*)"が1つ1行になるのかがわかりません・・・ もう少し詳しくご教授お願いします!
otn

2016/09/06 02:05

-o オプションの意味はおわかりなんですよね? 1行に複数個の「trans(~)」があった場合に、正規表現は1つの「trans(~)」だけにマッチしますので、1つ1行で出力されます。 もとの正規表現だと、1行に複数個のtransがあった場合に、「trans(~)~trans(~)」にマッチしてしまいます。
fearless0603

2016/09/06 02:18

はい。マッチした部分のみを表示するオプションが「-o」というのは勉強しました。 1行に複数個のtransがあった場合の、「trans(~)~trans(~)」がいままで書いていた「"trans(.*)"」の「.*」の部分にマッチしてしまうというのは理解できました。 "trans([^)]*)"の意味は、「trans(」で始っていて「)」で終わっているもののうち、「()」の中に「)」が含むもの以外取り出すということでしょうか??
otn

2016/09/06 02:26

>でしょうか?? そうですね。普通は、「"trans("で始まっていて")"以外が続いて")"で終わる物」と表現します。 -Pオプションで正規表現のPerl拡張の「最短マッチ」を使って、 grep -o -h -P "trans(.*?)" * と書くことも出来ます。"(" 以降に最初に出てきた ")" までにマッチします。
guest

0

かなり力業で。

bash

1grep -o -h "trans(.*)" * | \ 2 sed -e "s/\(trans(..[^)]*..)\)/|\1|/g" | \ 3 tr '|' "\n" | \ 4 grep trans | \ 5 sed -e 's/trans(.\(.*\).)/\1/'

マッチする箇所が1行に複数あると扱いにくいので、先に1行ずつに分割してから目的の置換を適用するほうが簡単です。

  1. マッチしたtrans()の前後に | を追加 => |trans(...)| になる
  2. | を改行に変換 => 1行に1つのtrans() になる
  3. 分割で不要になった行を削除
  4. 目的の置換

投稿2016/09/05 08:23

kodai

総合スコア759

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

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

0

ヒット位置がずれる問題は、sedで一致させるときに、「閉じカッコを含まない」ことを条件に加えれば解決できます。

bash

1rep -o -h "trans(.*)" * | sed -e "s/trans(['\"]\([^)]*\)['\"])/\1/"

投稿2016/09/05 07:01

maisumakun

総合スコア145183

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

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

fearless0603

2016/09/05 07:27

後半のおおおおが出力されず消えてしまいました・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問