bash-スペースを新しい行に置き換えます


70

次のような入力でスペースを新しい行に置き換えるにはどうすればよいですか?

/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5 等...

以下を入手するには:

/path/to/file
/path/to/file2
/path/to/file3
/path/to/file4
/path/to/file5

注意

他のユーザーを支援するためにこの質問を投稿していますが、この質問を入力し始めるまで、UNIX SEで役立つ答えを見つけるのは簡単ではありませんでした。その後、私は次を見つけました:

関連する質問

新しい行を見つけて置き換えるにはどうすればよいですか?



ls / path / to / | xargsエコー| sed 's / \ s \ + / \ n / g'
SD。

回答:


125

trコマンドを使用する

echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5"\
| tr " " "\n"

見つかったhttp://www.unix.com/shell-programming-scripting/67831-replace-space-new-line.html


1
trは私の最初の考えでもありましたが、それを行う方法はたくさんあります!trただし、これはまさにその目的です。
ロブ

5
1、しかし、コメントとして:ファイル名は自分自身にスペースが含まれている場合は動作しません
Bonsiスコット

20

この場合、printfを使用します。

printf '%s\n' /path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5

スペースがある場合はパスのいずれか、あなたは、スペースで分割されるのを防ぐために、そのファイルパスを引用することができます:

printf '%s\n' /path/to/file '/path/to/file with spaces' /path/to/another/file

一般的なテキストを変換trするには、既存の回答で説明されているように、最善の方法です。


1
将来の簡単なメモ:このソリューションを投稿してくれてありがとう、「echo」を使用するのに比べて、私にとって非常に信頼できます。
リースミス

5

区切り文字としてスペースを含む文字列があると仮定します。

newline_separated=${space_separated// /$'\n'}

ただし、おそらく間違った質問をしているのでしょう。(必ずしもそうではありません。たとえば、これはメイクファイルに表示される可能性があります。)ファイル名のスペースで区切られたリストは実際には機能しません。

プログラムがファイル名を引数として受け取る場合、それらをスペースで結合しないでください。"$@"それらを1つずつアクセスするために使用します。が、echo "$@"プリントの間にスペースを持つ引数が、それはのためにありますecho:それは区切りとしてスペースでその引数を出力します。somecommand "$@"ファイル名を個別の引数としてコマンドに渡します。引数を別々の行に出力したい場合は、使用できます

printf '%s\n' "$@"

スペースで区切られたファイル名があり、それらを処理するために配列に入れたい場合は、引用符なしの変数展開を使用して、値を文字で分割IFSできます(ワイルドカード展開を無効にする必要がありますset -f、そうでなければglobパターンは値で展開されます):

space_separated_list='/path/to/file1 /path/to/file2 /path/to/file3'
IFS=' '; set -f
eval "array=(\$space_separated_list)"
for x in "${array[@]}"; do 

これを、-f設定と設定IFS完了時の値を復元する関数にカプセル化できます。

split_list () {
  local IFS=' ' flags='+f'
  if [[ $- = *f* ]]; then flags=; fi
  set -f
  eval "$1=($2)"
  set $flags
}
split_list array '/path/to/file1 /path/to/file2 /path/to/file3'
for x in "${array[@]}"; do 

これに正解を変更します。スペースで区切られたリストに到達した方法を調査し、別の方法でその情報を取得する方が正しいと思います。私のような学習者にとっては、スニペットを少しコメントして、ローカル変数IFSや条件$-= fのようなことを教えてくれるとクールです。bashを数回使用する人は、そのようなことを知りません。
laconbass

@laconbass簡単な説明を追加しました。見上げるset -fIFS、bashのマニュアルでは、すべての詳細をしたい場合。参照してくださいunix.stackexchange.com/questions/16192/...
ジル・

@Guillesその短い説明で十分です。他の多くの人にも役立つと思います。お時間のTy
laconbass

IFSローカル設定は有効になりません
エリランマルカ

@EliranMalkaこれがどういう意味かわからない。スクリプトが想定どおりに動作しない場合は、ここで質問できます。
ジル

4

実用的で、sedを使用してください!!

sed 's/\s\+/\n/g' file

上記では、1つ以上の空白文字(\ s +)を改行(\ n)に置き換えます

これは多かれ少なかれです:

'substitute /one space or more/ for /newline/ globally'

1
変更を置換に置き換えます。これがsの実際の意味です!
ロブ

@Robありがとう、他の回答を編集できることを忘れないでください。
MGP

1
テキスト間に複数のスペースがある場合、空白行が表示されます。\ sの後に「+」を追加して、少なくとも1つのスペースをちょうど1つのスペースに並ぶように一致させることを示す必要があります。すなわち。sed 's / \ s + / \ n / g'
DarkHeart

4

tr@laconbassの代替として、xargsこの場合も使用できます。

echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4  /path/to/file5"\
| xargs -n1

利点は、複数の空白でもtr機能することですが、機能しません。


0

ここに私がそれをした方法があります:

echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5" | sed 's/ /\
'/g

sedコマンドのバックスラッシュの後にEnterキーを使用していることに注意してください。


持っているものpronsと短所sedを超えますかtr
laconbass

あなたの快適さのレベル:-) sed単なる文字を翻訳するのではなく、エディタであるため、より多くのことができると思います。
unxnut

4
sedこれ以上のことができますが、これは完全にやり過ぎです。trこの仕事に適したツールですがsed、正規表現の知識と正規表現は後で役立つでしょう。
ロブ

0

行がと呼ばれる変数にあると仮定する別のアプローチline

for path in $line;do echo $path;done

これは、デフォルトでBashが引数を空白で分割し、デフォルトでecho入力に改行を追加するという事実を利用しています。


この質問を投稿する前にubuntuシステムでこれを試してみましたが、機能しませんでした。
laconbass

0
echo word1 word2 ... | sed -e 'y/ /\n/;P;D'

は、単一スペースで区切られた単語を改行区切りに変換する別の方法です。


-1

次のスクリプトは理解しやすく、使いやすいです。

cat filename | tr ' ' '\n' | tee filename

2
回答の本質(tr)は、受け入れられた回答と同じです。あなたの答えには次の問題があります:a)コマンドは4つのスペースでインデントされていません(->マークダウンレイアウト)b)の使用catは無意味です(それをに置き換えることができます< filename tr ' ' '\n')。c)出力ファイル名は入力ファイル名と同じです。それを使用して、データ競合を作成します。
maxschlepzig

1
maxschlepzigの正しい分析は別として、これはスクリプトではなく、ハードコードされた名前を持つ一連の接続コマンドです(スクリプトには、使用するシェルを指定するヘッダーがあり、2つのパラメーターを使用して入力と出力を指定します)。それとは別に、私の家族の3人に2人は理解しにくいと感じています。たぶんそれは代表的なものではありませんが、あなた自身が理解する(またはこの場合はあなたが理解すると思う)ことは常に簡単に思えることを覚えておいてください。
アントン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.