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

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

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

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

sh

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

Q&A

解決済

1回答

2463閲覧

shellで特定文字列間の取得について

enoki_n

総合スコア12

シェル

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

sh

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

0グッド

0クリップ

投稿2016/06/17 12:41

編集2016/06/17 12:42

何度も質問失礼します。
sample.txt
/a_b_c_d/CNT_a/USERNAME_TARO_MAN_CNT_A/0610/GAB/AA/OUT/
/a_b_c_d/CNT_a/USERNAME_JAMES_MAN_CNT_CH/0000/GAB/AA/OUT/
/a_b_c_d/CNT_aw/USERNAME_TARO2_MAN_CNT_A/14/GAB/AA/OUT/
/a_b_c_d/CNT_a/USERNAME_JUN_LADY_CNT_CO/061788/GAB/AA/OUT/

#!bin/bash
FILE="sample.txt"

cat "$FILE" | while read line; do
temp=$(echo "$line" | grep -o -P "username_.*")

name=(expr "$temp" | ".USERNAME_(.)")
num=(expr "$temp" | "CNT
./(.)/")

echo $name $from
done

とした時どうしても最短一致ができません。
name=TARO num=0610
name=JAMES num=0000
name=TARO2 num=14
name=JUN num=061788
のように出力をしたいです。

正規表現.?も試しましたがやはり最長一致が起きてしまいます。
USERNAME_取り出したい_
CNT_.
/取り出したい/
のように一致文字列を取り出したいのですがいい案はないでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

先ほどの回答と対して変わらないですけど、次のように変数展開を使うとか?

sh

1#!/bin/bash 2 3FILE="sample.txt" 4 5cat "$FILE" | while read line; do 6 7 name=${line#*/USERNAME_} 8 num=${name#*/} 9 name=${name%%_*} 10 num=${num%%/*} 11 12 echo "name=$name num=$num" 13done 14 15# name=TARO num=0610 16# name=JAMES num=0000 17# name=TARO2 num=14 18# name=JUN num=061788

投稿2016/06/17 12:50

ngyuki

総合スコア4514

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問