web-dev-qa-db-ja.com

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

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

/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で有用な回答を見つけるのは容易ではありませんでした。その後、私は以下を見つけました:

関連する質問

どのようにして新しい行を見つけて置き換えることができますか?

84
laconbass

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 にあります

141
laconbass

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

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

スペースがある場合withinパスの1つである場合、スペースで分割されないようにファイルパスを引用できます。

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

一般的にテキストを変換するには、既存の回答でカバーされているように、trが最善の策です。

20
evilsoup

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

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

上記は、1つ以上の空白文字(\ s +)を改行(\ n)で置き換えることを示しています

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

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

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

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

しかし、あなたはおそらく間違った質問をしているでしょう。 (必ずしもそうとは限りません。たとえば、これはmakefileで現れる場合があります。)ファイル名のスペース区切りリストは実際には機能しません。ファイル名の1つにスペースが含まれているとどうなりますか?

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

printf '%s\n' "$@"

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

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 …

@laconbassのtrの代わりに、この場合はxargsを使用することもできます。

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

利点は、trが機能しない複数の空白文字でも機能することです。

4
FranMowinckel

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

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

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

0
unxnut

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

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

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

0
Joseph R.
echo Word1 Word2 ... | sed -e 'y/ /\n/;P;D'

シングルスペースで区切られた単語を改行で区切られる別の方法です。

0
user218374