2017-10-09 10 views
2

bash関数でSTDINを使用する方法はありますか?パイプラインのコマンドラインbash変数

# echo "somevar = (100)" >> test.txt 
# grep -Eo "\([[:digit:]]+\)$" test.txt 
(100) 

私の番号がわかりました。次に、角かっこを削除します。

string=`grep -Eo "\([[:digit:]]+\)$" test.txt`; echo ${string:1:-1} 
100 

だから私の問題は解決されましたが、私がやって長い時間を過ごしたことだった: 私がやったことだった

grep -Eo "\([[:digit:]]+\)$" test.txt | echo ${$1:1:-1} 
grep -Eo "\([[:digit:]]+\)$" test.txt | ${$1:1:-1} 
grep -Eo "\([[:digit:]]+\)$" test.txt | xargs echo ${:1:-1} 
grep -Eo "\([[:digit:]]+\)$" test.txt | xargs -I 's' echo ${s:1:-1} 

などなど...どれもの作品。

したがって、可能であれば、bashコマンドでどのようにpiped in値を使用するのですか?

+0

あなたが書いている構文が何を意味するのかは明確ではありません。 –

+0

...これは、シェルがネイティブで使用するための入力ストリームを読む一般的な議論については、[BashFAQ#1](http://mywiki.wooledge.org/BashFAQ/001)と[BashFAQ#24 ](http://mywiki.wooledge.org/BashFAQ/024)を参照してください。 –

+0

パイプに変数を格納するのではなく、パイプを使用して作業の例と同じことを達成できるかどうかを知りたいです。 BashFAQへのあなたのリンクは私の質問に答えるようですが。 – Martin

答えて

1

echo "somevar = (100)" | grep -Eo "\([[:digit:]]+\)$" | while read in 
do 
    echo $in 
done 

whileループはにreadコマンドを使用します。一度に1行を変数INに読み込みます。ループ内では、必要な治療を行うことができます。この場合、入力値を戻すことを示すためにechoを使用しました。

+0

この特定の配合は[BashFAQ#24](http://mywiki.wooledge.org/BashFAQ/024)に脆弱です。 –

+0

(btw、all-caps変数名はOSまたはシェルの意味を持つ変数に使用されますが、少なくとも1つの小文字の名前はアプリケーション用に予約されています - http://pubs.opengroup.org/onlinepubs/9699919799を参照してください。 /basedefs/V1_chap08.html、第4段落;したがって、 '' readline'または '' IFS = read -r line'の方が、バックスラッシュや先頭/末尾の空白をmangleしたくない場合)が良いでしょう。 –

+0

@Charles Duffyは、 'IN'変数はループの外側では使用できないと述べていますが、内部で使用すると良いです。私はそれを小文字に変更しました。 –

0

使用している構文は変数です。変数grepの出力を変数に保存するのは自然な方法です。

パイプラインを使用する場合は、変数ではなく標準入力を変更する必要があります。考慮するsed

あなたがパイプからいくつかの入力を使用すると、入力の各行が個別に処理されるべきであることを、あなたは試みることができると仮定すると
grep -Eo "\([[:digit:]]+\)$" test.txt | sed 's/^(\|)$//g' 
関連する問題