次のような入力でスペースを新しい行に置き換えるにはどうすればよいですか?
/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で有用な回答を見つけるのは容易ではありませんでした。その後、私は以下を見つけました:
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 にあります
この場合、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
が最善の策です。
実用的で、sedを使用してください!!
sed 's/\s\+/\n/g' file
上記は、1つ以上の空白文字(\ s +)を改行(\ n)で置き換えることを示しています
これは多かれ少なかれです:
'substitute /one space or more/ for /newline/ globally'
区切り文字としてスペースを含む文字列があると仮定します。
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
が機能しない複数の空白文字でも機能することです。
ここに私がそれをした方法があります:
echo "/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5" | sed 's/ /\
'/g
sed
コマンドでバックスラッシュの後にEnterキーを使用していることに注意してください。
別のアプローチ、行がline
と呼ばれる変数にあると仮定します:
for path in $line;do echo $path;done
これは、デフォルトでBashが引数を空白で分割すること、およびecho
がデフォルトで入力に改行を追加することを利用しています。
echo Word1 Word2 ... | sed -e 'y/ /\n/;P;D'
シングルスペースで区切られた単語を改行で区切られる別の方法です。