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

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

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

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

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

sh

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

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

Q&A

解決済

1回答

573閲覧

標準出力に空白文字を含む複数の文字を流し、パイプ先で文字列のまとまりごとに受けて扱いたい

noc

総合スコア73

bash

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

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

sh

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

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

0グッド

0クリップ

投稿2020/10/10 10:29

クォートで囲って一塊にして渡した空白を含んだ文字列が、パイプ先では空白区切りで解釈されます。パイプ先で一塊にした文字列ごとにグループとして認識させることはできないのでしょうか。

bash

1foo(){ 2 while read -r a b c; do 3 echo a is $a 4 echo b is $b 5 echo c is $c 6 done 7} 8bar(){ 9 while read -r x; do 10 for y in $x;do 11 echo "$y" 12 done 13 done 14} 15echo "aaa aa" "bbb bb" "ccc cc" | foo 16# => a is aaa 17# b is aa 18# c is bbb bb ccc cc 19echo "aaa aaa" "bbb bb" "ccc cc" | bar 20# => aaa 21# aa 22# bbb 23# bb 24# ccc 25# cc

expected

a is aaa aa b is bbb bb c is ccc cc

ゴールはリネーム前のファイルパスとリネーム後のファイルパスをペアにしてパイプに流し、パイプ先ではそれぞれ別の値として取り出して扱うことなのですが、ファイルパスに空白文字を含む可能性があるのでクォートしています。
もしも原理的に無理なのならば、タブ文字を区切りにするなど、他の方法を考えたいと存じます。

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

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

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

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

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

takasima20

2020/10/10 11:09

素直に二行で送った方が扱いやすそうな気がするなあ。
noc

2020/10/10 12:03

一回限りならそれでもいいのですが、 ``` (echo aaa bbb ccc; echo ddd eee fff; echo ggg hhh iii) | foo ``` のように一行一エントリで何行にもわたって送りたいので。
guest

回答1

0

ベストアンサー

パイプの中を流れる文字列は、aaa aa bbb bb ccc ccなので、受け取った側でaaa aaの空白とaa bbbの空白を区別する手段が無いです。

お書きのように、区切りを改行やタブやヌル等の空白以外の文字にするしかないです。

ヌル文字はファイル名に使えないので、grep find xargsなどでは、任意の文字をパイプで渡すために区切りをヌル文字(\0)にするオプションがあります。

例:find . -print0 -name '* *' | xargs -0 rm・・・空白を含んだ名前のファイルを削除
これだとファイル名が空白やタブや改行を含んでいても大丈夫です。

投稿2020/10/10 11:51

otn

総合スコア85901

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

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

noc

2020/10/10 12:07

原理的に無理なのですね。 ありがとうございます。 ファイルに使えない文字で区切る方法に挑戦してみます。
otn

2020/10/10 12:27

区切りを \0 にするとreadでその後が読めませんね。 区切りは普通は\tか\nで大丈夫でしょう。改行文字を含んだファイルを意図的に作る人はいないと思うので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問